1基础知识 1.1标准定义 抽象工厂模式标准定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 1.2分析和说明 抽象工厂模式是一个创建性的模式。与工厂方法模式一样,它要求工厂类和产品类分开。但是核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。一个具体的工厂类负责创建产品族中的各个产品。其实质就是由1个工厂类层次、N个产品类层次和N×M个产品组成。 图1抽象工厂结构 AbstractFactory结构如图1所示。抽象工厂模式包括四个角色:抽象工厂角色;具体工厂类角色;抽象产品角色和具体产品角色。分别描述如下。 抽象工厂(AbstractFactory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用接口或者抽象类实现,而所有的具体工厂类必须实现这个接口或继承这个抽象类。 具体工厂类(ConcreteFactory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。实际应用中使用具体类来实现这个角色。 抽象产品(AbstractProduct)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或者抽象类来实现这一角色。 具体产品(ConcreteProduct)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。实际应用中使用具体类来实现这个角色。 2应用场景举例 比如几家公司同时能生产计算机和电话。但是计算机系列包括PC机、笔记本电脑和服务器。电话系列包括座机电话和手机。对于这种情况就可以采用抽象工厂模式。其业务用例图见图3。 图2抽象工厂模式的用例图 在这里可以把Company理解为抽象工厂(AbstractFactory)角色。CompanyA和CompanyB是具体工厂(ConcreteCreator)角色。Computer和Telephone是两类不同的抽象产品(Product)角色。NotebookComputer和PersonalComputer是基于Computer抽象产品的具体产品(ConcreteProduct)角色。DesktopPhone和Mobile是基于Telephone抽象产品的具体产品(ConcreteProduct)角色。其实现类图如图3所示。 图3抽象工厂模式的类图 抽象工厂模式实现的顺序图如图4所示,其实现步骤描述:①创建一个Company1对象;②调用Company1对象buildProduct方法,实际上从Company1对象创建一个Computer产品,为PersonalComputer对象。③对PersonalComputer对象采取doUse方法;④⑤与②③步骤一样,不过产生的是NotebookComputer对象。⑥调用Company1对象buildProduct方法,实际上从Company1对象创建一个Telephone产品,为DesktopPhone对象。⑦对DesktopPhone对象采取doUse方法;⑧⑨与⑥⑦步骤一样,不过产生的是Mobile对象。 图4抽象工厂模式实现顺序图 3.Java的实现程序代码 Java程序实现主要包括Company接口文件,Computer抽象类文件,Telephone抽象类文件,CompanyA类文件,CompanyB类文件,Mobile类文件、DesktopPhone类文件、NotebookComputer类文件和PersonalComputer类文件等9个文件。其关系如图3所示。下面分别列出这9个文件的程序代码,最后列出测试代码并显示输出结果。 Company属于抽象工厂(AbstractFactory)角色,Company的接口程序代码清单01所示。 程序代码清单01 publicinterfaceCompany{ publicComputerbulidComputer(StringParameter); publicTelephonebulidTelephone(StringParameter); } Computer抽象类和Telephone抽象类属于抽象产品(AbstractProduct)角色,Computer和Telephone抽象类程序代码清单02所示。 程序代码清单02 publicabstractclassComputer{ publicvoiddoUse(){} } publicabstractclassTelephone{ publicvoiddoUse(){} } CompanyA类和CompanyB类属于具体工厂类(ConcreteFactory)角色,CompanyA类和CompanyB类程序代码清单03所示。 程序代码清单03 publicclassCompanyAimplementsCompany{ publicComputerbulidComputer(StringParameter){ if(Parameter.equals(个人电脑))returnnewPersonalComputer(); elseif(Parameter.equals(笔记本电脑))returnnewNotebookComputer(); elsereturnnull; } publicTelephonebulidTelephone(StringParameter){ if(Parameter.equals(座机电话))returnnewDesktopPhone(); elseif(Parameter.equals(手机))returnnewMobile(); elsereturnnull; } } publicclassCompanyBimplementsCompany{ publicComputerbulidComputer(StringParameter){ if(Parameter.equals(个人电脑))returnnewPersonalComputer(); elseif(Parameter.equals(笔记本电脑))returnnewNotebookComputer(); elsereturnnull; } publicTelephonebulidTelephone(StringParameter){ if(Parameter.equals(座机))returnnewDesktopPhone(); elseif(Parameter.equals(手机))returnnewMobile(); elsereturnnull; } } Mobile类和DesktopPhone类属于具体产品(ConcreteProduct)角色,Mobile类和DesktopPhone类程序代码清单04所示。 程序代码清单04 publicclassMobileextendsTelephone{ publicvoiddoUse(){ System.out.println(这是手机的功能); } } publicclassDesktopPhoneextendsTelephone{ publicvoiddoUse(){ System.out.println(这是座机电话的功能); } } NotebookComputer类和PersonalComputer类属于具体产品(ConcreteProduct)角色,NotebookComputer类和PersonalComputer类程序代码清单05所示。 程序代码清单05 publicclassNotebookComputerextendsComputer{ publicvoiddoUse(){ System.out.println(这是笔记本电脑的功能); } } publicclassPersonalComputerextendsComputer{ publicvoiddoUse(){ System.out.println(这是个人计算机的功能); } } 抽象工厂模式测试程序的代码清单06如下: 程序代码清单06 publicclassClient{ publicstaticvoidmain(String[]args){ Company北京治疗白癜风最好的医生在哪家医院白癜风治疗花费
|