软件设计-抽象工厂模式
使用抽象工厂模式,完成下述产品等级结构:
类图
代码结构
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 implements MWFactory{ 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("黑色皮肤的男人出现"); } }
package rjsj.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; }
运行截图