設計模式-抽象工廠模式例項-01
阿新 • • 發佈:2022-03-09
設計模式-抽象工廠模式例項-01
要點:
需要一個工廠生產多個產品物件。
優點:
隔離了具體類的生成,使客戶端不知道什麼被建立;
保證客戶端始終只使用一個產品族的物件;
增加新的產品族很方便,符合開閉原則。
缺點:
增加新的產品等級結構很複雜,不符合開閉原則。
適用環境:
一個系統不應當依賴於產品類的例項如何被建立、組合和表達的細節;
系統中有多個產品族但每次只使用其中某一產品族;
屬於同一個產品族的產品將在一起被使用;
產品等級結構穩定。
靜態工廠模式、工廠方法模式、抽象工廠模式對比:
例項1:海爾工廠和TCL工廠生產電視和空調。
類圖
程式碼實現:
程式碼結構:
factory:
EFactory:
import abstractTVFactory.airConditioner.AirConditioner; import abstractTVFactory.television.Television; //抽象工廠類 public interface EFactory { public Television produceTelevision(); public AirConditioner produceAirConditioner(); }
HaierFactory:
import abstractTVFactory.airConditioner.AirConditioner;import abstractTVFactory.airConditioner.HaierAirConditioner; import abstractTVFactory.television.HaierTelevision; import abstractTVFactory.television.Television; //具體工廠類HaierFactory public class HaierFactory implements EFactory { public Television produceTelevision(){ return new HaierTelevision(); }public AirConditioner produceAirConditioner(){ return new HaierAirConditioner(); } }
TCLFactory:
import abstractTVFactory.airConditioner.AirConditioner; import abstractTVFactory.airConditioner.TCLAirConditioner; import abstractTVFactory.television.TCLTelevision; import abstractTVFactory.television.Television; //具體工廠類TCLFactory public class TCLFactory implements EFactory { public Television produceTelevision(){ return new TCLTelevision(); } public AirConditioner produceAirConditioner(){ return new TCLAirConditioner(); } }
television:
Television:
//抽象產品類 public interface Television { public void play(); }
HaierTelevision:
//具體產品類HaierTV public class HaierTelevision implements Television { public void play(){ System.out.println("Haier TV is playing"); } }
TCLTelevision:
//具體產品類TCLTV public class TCLTelevision implements Television { public void play(){ System.out.println("TCL TV is playing"); } }
airConditioner:
AirConditioner:
//抽象工廠類AirConditioner public interface AirConditioner { public void use(); }
HaierAirConditioner:
//具體產品類Haier空調 public class HaierAirConditioner implements AirConditioner { public void use(){ System.out.println("Haier AirConditioner is using"); } }
TCLAirConditioner:
//具體產品類TCL空調 public class TCLAirConditioner implements AirConditioner { public void use(){ System.out.println("TCL AirConditioner is using"); } }
utils:
XMLUtil:
import org.w3c.dom.*; import javax.xml.parsers.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { public static Object getBean(){ try { //建立文件物件 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/abstractTVFactory/utils/config.xml")); //獲取包含支付方式名稱的文字節點 NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通過類名生成例項物件並將其返回 Class c=Class.forName(cName); Object obj=c.newInstance(); return obj; }catch (Exception e){ e.printStackTrace(); return null; } } }
config.xml:
<?xml version="1.0" ?> <config> <className>abstractTVFactory.factory.TCLFactory</className> </config>
Client:
Client:
import abstractTVFactory.airConditioner.AirConditioner; import abstractTVFactory.factory.EFactory; import abstractTVFactory.television.Television; import abstractTVFactory.utils.XMLUtil; public class Client { public static void main(String[] args) { try{ EFactory factory; Television tv; AirConditioner airConditioner; factory = (EFactory) XMLUtil.getBean(); tv = factory.produceTelevision(); tv.play(); airConditioner = factory.produceAirConditioner(); airConditioner.use(); }catch (Exception e){ System.out.println(e.getMessage()); } } }