您好,欢迎访问三七文档
第4章抽象工厂(AbstractFactory)(工具箱(Kit或Toolkit)模式)组装电脑:需要选择一系列的配件,比如:CPU、硬盘、内存、主板、电源、机箱等等。简单点,只考虑选择CPU和主板的问题①选择CPU的时候,面临一系列的问题②选择主板的时候,也有一系列的问题现在需要使用程序来模拟装机过程,尤其是选择组装电脑配件的过程,该如何实现呢?选择组装电脑的配件不用模式的解决方案考虑客户的功能,需要选择自己需要的CPU和主板,然后告诉装机工程师自己的选择,接下来就等着装机工程师组装机器了。对装机工程师而言,只需知道CPU和主板的接口,而不知道具体实现,很明显可以用上简单工厂或工厂方法模式,为了简单,这里选用简单工厂。客户告诉装机工程师自己的选择,然后装机工程师会通过相应的工厂去获取相应的实例对象。//CPU的接口publicinterfaceCPUApi{publicvoidcalculate();}//Intel的CPU实现publicclassIntelCPUimplementsCPUApi{privateintpins=0;//CPU的针脚数目publicIntelCPU(intpins){this.pins=pins;}publicvoidcalculate(){System.out.println(IntelCPUpins=+pins);}}//AMD的CPU实现publicclassAMDCPUimplementsCPUApi{privateintpins=0;//CPU的针脚数目publicAMDCPU(intpins){this.pins=pins;}publicvoidcalculate(){System.out.println(AMDCPUpins=+pins);}}//主板的接口publicinterfaceMainboardApi{publicvoidinstallCPU();}//技嘉的主板publicclassGAMainboardimplementsMainboardApi{privateintcpuHoles=0;//CPU插槽的孔数publicGAMainboard(intcpuHoles){this.cpuHoles=cpuHoles;}publicvoidinstallCPU(){System.out.println(GAMainboardcpuHoles=+cpuHoles);}}//微星的主板publicclassMSIMainboardimplementsMainboardApi{privateintcpuHoles=0;//CPU插槽的孔数publicMSIMainboard(intcpuHoles){this.cpuHoles=cpuHoles;}publicvoidinstallCPU(){System.out.println(MSIMainboardcpuHoles=+cpuHoles);}}//创建CPU的简单工厂publicclassCPUFactory{publicstaticCPUApicreateCPUApi(inttype){CPUApicpu=null;//根据参数来选择并创建相应的CPU对象if(type==1){cpu=newIntelCPU(1156);}elseif(type==2){cpu=newAMDCPU(939);}returncpu;}}//创建主板的简单工厂publicclassMainboardFactory{publicstaticMainboardApicreateMainboardApi(inttype){MainboardApimainboard=null;//根据参数来选择并创建相应的主板对象if(type==1){mainboard=newGAMainboard(1156);}elseif(type==2){mainboard=newMSIMainboard(939);}returnmainboard;}}//装机工程师的类publicclassComputerEngineer{privateCPUApicpu=null;privateMainboardApimainboard=null;//装机过程publicvoidmakeComputer(intcpuType,intmainboardType){//1:首先准备好装机所需要的配件prepareHardwares(cpuType,mainboardType);//2:组装机器//3:测试机器//4:交付客户}//准备装机所需要的配件privatevoidprepareHardwares(intcpuType,intmainboardType){//直接找相应的工厂获取this.cpu=CPUFactory.createCPUApi(cpuType);this.mainboard=MainboardFactory.createMainboardApi(mainboardType);//测试一下配件是否好用this.cpu.calculate();this.mainboard.installCPU();}}//客户端publicclassClient{publicstaticvoidmain(String[]args){//创建装机工程师对象ComputerEngineerengineer=newComputerEngineer();//告诉装机工程师自己选择的配件,让装机工程师组装电脑engineer.makeComputer(1,1);}}对于装机工程师,只知CPU和主板的接口,而不知道具体实现的问题。但还有一个问题没有解决:CPU对象和主板对象其实是有关系的,是需要相互匹配的有何问题?①一个是只知道所需要的一系列对象的接口,而不知具体实现,或者是不知道具体使用哪一个实现②这一系列对象是相关或者相互依赖的。也就是说既要创建接口的对象,还要约束它们之间的关系。两个问题点定义一个抽象工厂,在里面虚拟的创建客户端需要的这一系列对象(虚拟的就是定义创建这些对象的抽象方法,并不去真的实现,然后由具体的抽象工厂的子类来提供这一系列对象的创建)为同一个抽象工厂提供很多不同的实现,那么创建的这一系列对象也就不一样了(抽象工厂在这里起到一个约束的作用,并提供所有子类的一个统一外观,来让客户端使用)解决方案面对的是多产品等级结构的系统设计(一个产品等级结构由相同结构的产品组成)抽象工厂模式产品族(ProductFamily):指由同一个工厂生产的,位于不同产品等级结构中的一组产品1.AMD的CPU和ADM芯片的主板,组成一个产品族2.Intel的CPU和Intel芯片的主板,又组成一个产品族两个产品族都来自于两个产品等级结构:CPU和主板抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类一个工厂可以创建出分属于不同产品等级结构的一个产品族中所有对象抽象工厂模式抽象工厂类UML图①抽象工厂类(AbstractFactory)(1个):定义创建不同类实例的多个接口;创建与管理子工厂对象,提供统一方法以取得不同的子工厂对象.它是与应用系统商业逻辑无关的②具体工厂类(ConcreteFactory)(多个):在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。①抽象产品(AbstractProduct)(多个)角色:是所创建的对象的父类,或它们共同拥有的接口②具体产品类ConcreteProduct)(多个):继承自抽象产品类,它们之间一般存在或多或少的依耐关系1.在抽象工厂模式中,抽象产品可能是一个或多个,从而构成一个或多个产品族2.在只有一个产品族的情况下,抽象工厂模式实际上退化到工厂方法模式。说明使用抽象工厂模式重写示例1)前面实现的CPU接口和CPU实现对象,还有主板的接口和实现对象,都不需要变化2)前面示例中的创建CPU的简单工厂和创建主板的简单工厂,都不再需要了3)新加入抽象工厂的定义4)抽象工厂的实现,也就是具体的装机方案的实现//抽象工厂的接口,声明创建抽象产品对象的操作publicinterfaceAbstractFactory{/***创建CPU的对象*@returnCPU的对象*/publicCPUApicreateCPUApi();/***创建主板的对象*@return主板的对象*/publicMainboardApicreateMainboardApi();}//装机方案一:Intel的CPU+技嘉的主板publicclassSchema1implementsAbstractFactory{publicCPUApicreateCPUApi(){returnnewIntelCPU(1156);}publicMainboardApicreateMainboardApi(){returnnewGAMainboard(1156);}}//装机方案二:AMD的CPU+微星的主板publicclassSchema2implementsAbstractFactory{publicCPUApicreateCPUApi(){returnnewAMDCPU(939);}publicMainboardApicreateMainboardApi(){returnnewMSIMainboard(939);}}//装机工程师的类publicclassComputerEngineer{//定义组装机器需要的CPUprivateCPUApicpu=null;//定义组装机器需要的主板privateMainboardApimainboard=null;//装机过程publicvoidmakeComputer(AbstractFactoryschema){//1:首先准备好装机所需要的配件prepareHardwares(schema);//2:组装机器//3:测试机器//4:交付客户}//准备装机所需要的配件privatevoidprepareHardwares(AbstractFactoryschema){//使用抽象工厂来获取相应的接口对象this.cpu=schema.createCPUApi();this.mainboard=schema.createMainboardApi();//测试一下配件是否好用this.cpu.calculate();this.mainboard.installCPU();}}//客户端publicclassClient{publicstaticvoidmain(String[]args){//创建装机工程师对象ComputerEngineerengineer=newComputerEngineer();//客户选择并创建需要使用的装机方案对象AbstractFactoryschema=newSchema1();//告诉装机工程师自己选择的装机方案,让装机工程师组装电脑engineer.makeComputer(schema);}}产品角色图示例1系统设计类图UMLpublicinterfaceGardener{publicFruitcreateFruit(Stringname);publicVeggiecreateVeggie(Stringname);}publicinterfaceFruit{}publicinterfaceVeggie{}抽象工厂Gardener.java抽象水果产品Fruit.java抽象蔬菜产品Veggie.javapublicclassTropicalFruitimplementsFruit{privateStringname;publicTropicalFruit(Stringname){System.out.println(热带工厂为您创建了:热带水果-+name);}publicStringgetName(){r
本文标题:第4章抽象工厂模式
链接地址:https://www.777doc.com/doc-2109745 .html