軟體設計-抽象工廠模式
阿新 • • 發佈:2021-12-13
使用抽象工廠模式,完成下述產品等級結構:
類圖
程式碼結構
java
package rjsj.no4; public class BlackSkinWomen implements Women{ public void play() { System.out.println("黑色面板的女人出現"); } }
package rjsj.no4; public class Client { public static void main(String args[]) { try { MWFactory factory; Man m; Women w; factory=(MWFactory) XMLUtil.getBean(); m=factory.produceMan(); m.play(); w=factory.produceWomen(); w.play(); } catch(Exception e) { System.out.println(e.getMessage()); } } }
package rjsj.no4; public class BlackFactory implementsMWFactory{ public Man produceMan() { return new BlackSkinMan(); } public Women produceWomen() { return new BlackSkinWomen(); } }
package rjsj.no4; public class BlackSkinMan implements Man{ public void play() { System.out.println("黑色面板的男人出現"); } }
packagerjsj.no4; public class WhiteFactory implements MWFactory{ public Man produceMan() { return new WhiteSkinMan(); } public Women produceWomen() { return new WhiteSkinWomen(); } }
package rjsj.no4; public class WhiteSkinMan implements Man{ public void play() { System.out.println("白色面板的男人出現"); } }
package rjsj.no4; public class WhiteSkinWomen implements Women{ public void play() { System.out.println("白色面板的女人出現"); } }
<?xml version="1.0"?> <config> <className>YellowFactory</className> </config>
package rjsj.no4; public interface Man { public void play(); }
package rjsj.no4; public interface MWFactory { public Man produceMan(); public Women produceWomen(); }
package rjsj.no4; public class YellowFactory implements MWFactory{ public Man produceMan() { return new YellowSkinMan(); } public Women produceWomen() { return new YellowSkinWomen(); } }
package rjsj.no4; public class YellowSkinMan implements Man{ public void play() { System.out.println("黃色面板男人出現"); } }
package rjsj.no4; public class YellowSkinWomen implements Women{ public void play() { System.out.println("黃色面板的女人出現"); } }
package rjsj.no4; public interface Women { public void play(); }
package rjsj.no4; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { //該方法用於從XML配置檔案中提取具體類類名,並返回一個例項物件 public static Object getBean() { try { //建立文件物件 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/rjsj/no4/config.xml")); //獲取包含類名的文字節點 NodeList nl = doc.getElementsByTagName("className"); //System.out.println(nl); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通過類名生成例項物件並將其返回 Class c=Class.forName("rjsj.no4."+cName); Object obj=c.newInstance(); return obj; } catch(Exception e) { e.printStackTrace(); return null; } } }
C++
#include <iostream> using namespace std; class SexFactory{ public: virtual void produce(){ cout<<"無性別孩子"<<endl; } }; class girlFactory:public SexFactory{ public: void produce(){ // TODO Auto-generated method stub cout<<"女孩"<<endl; } }; class boyFactory:public SexFactory{ public: void produce(){ // TODO Auto-generated method stub cout<<"男孩"<<endl; } }; class ColorFactory{ public: virtual void produce(){ cout<<"透明"; }; }; class yellowFactory:public ColorFactory{ public: void produce(){ // TODO Auto-generated method stub cout<<"黃種"; } }; class whiteFactory:public ColorFactory{ public: void produce(){ // TODO Auto-generated method stub cout<<"白種"; } }; class blackFactory:public ColorFactory{ public: void produce(){ // TODO Auto-generated method stub cout<<"黑種"; } }; class Person{ public: Person(){ SexFactory* sex; ColorFactory* color; int s,c; cout<<"請輸入你要生產的小人的性別 1是女孩 2是男孩"<<endl; cin>>s; cout<<"請輸入你要生產的小人的顏色 1是黃種 2是黑種 3是白種"<<endl; cin>>c; cout<<"您生產了一個"; yellowFactory y; blackFactory b; whiteFactory w; switch(c) { case 1: color=&y; break; case 2: color=&b; break; case 3: color=&w; break; default:; } color->produce(); girlFactory g; boyFactory bo; switch(s) { case 1: sex=&g; break; case 2: sex=&bo; break; default:; } sex->produce(); } }; int main() { Person person; return 0; }
執行截圖