除了洗衣服,這次加上看電視的功能了
1.洗衣服有IWash接口和兩個實現類
2.看電視也有ITv接口和兩個實現類
3.工廠方面首先是一個工廠接口,然后定義一個實現類,通過讀取xml文件反射生成類,這樣以后洗衣服和看電視具體實現改變時無須修改工廠類,只需要修改xml文件
java代碼如下
beans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="滾筒洗衣機" class="com.liu.pattern3.GTWasher"></bean> <bean id="波輪洗衣機" class="com.liu.pattern3.BLWasher"></bean> <bean id="國產電視" class="com.liu.pattern3.GCTv"></bean> <bean id="進口電視" class="com.liu.pattern3.JKTv"></bean> </beans>IFactory
package com.liu.pattern3;//抽象工廠public interface IFactory { public IWasher createWasher(String name); public ITv createTv(String name);}MyFactory
package com.liu.pattern3;public class MyFactory implements IFactory { PRivate ClassPathXmlLoader loader = new ClassPathXmlLoader(); @Override public IWasher createWasher(String name) { return (IWasher)loader.getBean(name); } @Override public ITv createTv(String name) { return (ITv)loader.getBean(name); }}ClassPathXmlLoader
package com.liu.pattern3;import java.io.IOException;import java.util.HashMap;import java.util.List;import org.jdom2.Document;import org.jdom2.Element;import org.jdom2.JDOMException;import org.jdom2.input.SAXBuilder;public class ClassPathXmlLoader { private HashMap<String,Object> beans; public Object getBean(String name){ return beans.get(name); } public ClassPathXmlLoader(){ //Load xml File SAXBuilder builder = new SAXBuilder(); beans = new HashMap<String, Object>(); try { Document doc = builder.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); Element root = doc.getRootElement(); List<Element> list = root.getChildren("bean"); for(int i=0;i<list.size();i++){ Element bean = list.get(i); String id = bean.getAttributeValue("id"); String name = bean.getAttributeValue("class"); Object o = Class.forName(name).newInstance(); beans.put(id,o); } } catch (Exception e) { e.printStackTrace(); } }}IWasher
package com.liu.pattern3;public interface IWasher { public void wash();}BLWasher
package com.liu.pattern3;public class BLWasher implements IWasher { @Override public void wash() { System.out.println("波輪洗衣機洗衣服了"); }}GTWasher
package com.liu.pattern3;public class GTWasher implements IWasher { @Override public void wash() { System.out.println("滾筒洗衣機洗衣服了"); }}ITv
package com.liu.pattern3;public interface ITv { public void see();}JKTv
package com.liu.pattern3;public class JKTv implements ITv { @Override public void see() { System.out.println("看進口電視"); }}GCTv
package com.liu.pattern3;public class GCTv implements ITv { @Override public void see() { System.out.println("看國產電視"); }}Test
package com.liu.pattern3;public class Test { public static void main(String[] args) { IFactory factory = new MyFactory(); IWasher washer = factory.createWasher("波輪洗衣機"); washer.wash(); ITv tv = factory.createTv("國產電視"); tv.see(); }}
C#實現代碼
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Xml;using System.Collections;using System.Reflection;namespace com.liu.pattern3{ public class ClassPathXmlLoader { private Hashtable beans; public ClassPathXmlLoader(){ beans = new Hashtable(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("beans.xml"); XmlNode root = xmlDoc.SelectSingleNode("beans"); XmlNodeList list = root.SelectNodes("bean"); for (int i = 0; i < list.Count; i++) { XmlNode node = list.Item(i); String id = node.Attributes["id"].Value; String name = node.Attributes["class"].Value; Object o = Assembly.Load("AbstractFactory").CreateInstance(name); beans.Add(id, o); } } public Object GetBean(String name){ return beans[name]; } } public interface IWasher { void Wash(); } public class GTWasher : IWasher { public void Wash() { System.Console.WriteLine("滾筒洗衣機洗衣服了"); } } public class BLWasher : IWasher { public void Wash() { System.Console.WriteLine("波輪洗衣機洗衣服了"); } } public interface ITv { void See(); } public class GCTv:ITv { public void See() { System.Console.WriteLine("看國產電視"); } } public class JKTv:ITv { public void See() { System.Console.WriteLine("看進口電視"); } } public interface IFactory { IWasher CreateWasher(String name); ITv CreateTv(String name); } public class MyFactory : IFactory { private ClassPathXmlLoader loader = new ClassPathXmlLoader(); public IWasher CreateWasher(String name) { return (IWasher)loader.GetBean(name); } public ITv CreateTv(String name) { return (ITv)loader.GetBean(name); } } class Test { static void Main(string[] args) { MyFactory factory = new MyFactory(); IWasher washer = factory.CreateWasher("滾筒洗衣機"); washer.Wash(); ITv tv = factory.CreateTv("進口電視"); tv.See(); System.Console.ReadKey(); } }}
新聞熱點
疑難解答