设计模式 创建模式之抽象工厂模式
2016-07-29 10:53
344 查看
1 基础知识
1.1 标准定义
抽象工厂模式标准定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
1.2 分析和说明
抽象工厂模式是一个创建性的模式。与工厂方法模式一样,它要求工厂类和产品类分开。但是核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应该被实例化这种细节。一个具体的工厂类负责创建产品族中的各个产品。其实质就是由1个工厂类层次、N个产品类层次和N*M个产品组成。
抽象工厂模式包括四个角色:抽象工厂角色、具体工厂角色、抽象产品角色和具体产品角色。分别描述如下:
抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用接口或抽象类实现,而所有的具体工厂类必须实现这个接口或继承这个抽象类。
具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。实际应用中使用具体类来实现这个角色。
抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或抽象类来实现这一角色。
具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。实际应用中使用具体类来实现这个角色。
2 应用场景举例
比如几家公司同时能生产计算机和电话。但是计算机系统包括PC机、笔记本电脑和服务器。电话系列包括座机和手机。对于这种情况就可以采用抽象工厂模式。
在这里可以把Company理解为抽象工厂角色。CompanyA和CompanyB是具体工厂角色。Computer和Telephone是两类不同的抽象产品角色。NotebookComputer和PersonalComputer是基于Computer抽象产品的具体产品角色。DesktopPhone和Mobile是基于Telephone抽象产品的具体产品角色。其类图如下:
3 Java的实现程序代码
Java程序实现主要包括Company接口文件,Computer抽象类文件,Telephone抽象类文件,CompanyA类文件,CompanyB类文件,Mobile类文件,DesktopPhone类文件,NotebookComputer类文件和PersonalComputer类文件等9个文件。下面分别列出程序代码
Company属于抽象工厂角色,Company的接口程序代码
Computer抽象类和Telephone抽象类属于抽象产品角色。
CompanyA和CompanyB属于具体工厂类角色
NotebookComputer类和PersonalComputer类属于具体产品角色
测试程序代码
1.1 标准定义
抽象工厂模式标准定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
1.2 分析和说明
抽象工厂模式是一个创建性的模式。与工厂方法模式一样,它要求工厂类和产品类分开。但是核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应该被实例化这种细节。一个具体的工厂类负责创建产品族中的各个产品。其实质就是由1个工厂类层次、N个产品类层次和N*M个产品组成。
抽象工厂模式包括四个角色:抽象工厂角色、具体工厂角色、抽象产品角色和具体产品角色。分别描述如下:
抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用接口或抽象类实现,而所有的具体工厂类必须实现这个接口或继承这个抽象类。
具体工厂角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。实际应用中使用具体类来实现这个角色。
抽象产品角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或抽象类来实现这一角色。
具体产品角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。实际应用中使用具体类来实现这个角色。
2 应用场景举例
比如几家公司同时能生产计算机和电话。但是计算机系统包括PC机、笔记本电脑和服务器。电话系列包括座机和手机。对于这种情况就可以采用抽象工厂模式。
在这里可以把Company理解为抽象工厂角色。CompanyA和CompanyB是具体工厂角色。Computer和Telephone是两类不同的抽象产品角色。NotebookComputer和PersonalComputer是基于Computer抽象产品的具体产品角色。DesktopPhone和Mobile是基于Telephone抽象产品的具体产品角色。其类图如下:
3 Java的实现程序代码
Java程序实现主要包括Company接口文件,Computer抽象类文件,Telephone抽象类文件,CompanyA类文件,CompanyB类文件,Mobile类文件,DesktopPhone类文件,NotebookComputer类文件和PersonalComputer类文件等9个文件。下面分别列出程序代码
Company属于抽象工厂角色,Company的接口程序代码
public interface Company{ public Computer buildComputer(String Parameter); public Telephone buildTelephone(String Parameter); }
Computer抽象类和Telephone抽象类属于抽象产品角色。
public abstract class Computer{ public void doUse(){} } public abstract class Telephone{ public void doUse(){} }
CompanyA和CompanyB属于具体工厂类角色
public class CompanyA implements Company{ public Computer buildComputer(String Parameter){ if(Parameter.equals("个人电脑"))return new PersonalComputer; else if(Parameter.eqauls("笔记本电脑"))return new notebookComputer(); else return null; } public Telephone buildTelephone(String Parameter){ if(Parameter.equals("座机电话"))return new DesktopPhone(); else if(Parameter.eqauls("手机"))return new Mobile(); else return null; } }
public class CompanyB implements Company{ public Computer buildComputer(String Parameter){ if(Parameter.equals("个人电脑"))return new PersonalComputer; else if(Parameter.eqauls("笔记本电脑"))return new notebookComputer(); else return null; } public Telephone buildTelephone(String Parameter){ if(Parameter.equals("座机电话"))return new DesktopPhone(); else if(Parameter.eqauls("手机"))return new Mobile(); else return null; } }
</pre><pre name="code" class="html"><span style="white-space:pre"> </span>Mobile类和DesktopPhone类属于具体产品角色
public class Mobile extends Telephone{ public void doUse(){ System.out.println("这是手机的功能"); } } public class desktopPhone extends Telephone{ public void doUse(){ System.out.println("这是座机电话的功能"); } }
NotebookComputer类和PersonalComputer类属于具体产品角色
public class NotebookComputer extends Computer{ public void doUse(){ System.out.println("这是笔记本电脑的功能"); } } public class PersonalComputer extends Computer{ public void doUse(){ System.out.println("这是个人计算机的功能"); } }
测试程序代码
public class client{ public static void main(String[] args){ Company company1 = new CompanyA(); Computer computer1 = company1.buildComputer("个人电脑"); computer1.doUse(); Computer computer2 = company1.buildComputer("笔记本电脑"); computer2.doUse(); Telephone telephone1 = company1.buildTelephone("座机电话"); telephone.doUse(); Telephone telephone2 = company1.buildTelephone("手机"); telephone2.doUse(); } }
相关文章推荐
- 设计模式--创建模式--抽象工厂模式
- java设计模式 -------- 创建模式 之 抽象工厂模式
- 设计模式之创建类模式——抽象工厂模式
- 设计模式之创建模式----抽象工厂模式
- 设计模式--创建模式--抽象工厂模式--java
- 用来创建对象的设计模式之抽象工厂模式
- 设计模式学习(六):产品族的创建-抽象工厂模式
- 设计模式学习(十四)————抽象工厂模式(使用Qt框架的反射技术——根据字符串动态创建类来实现)
- java设计模式 -------- 创建模式 之 抽象工厂模式
- Java 设计模式之抽象工厂模式的详解(创建模式)
- Objective-C设计模式——抽象工厂模式Abstract Factory(对象创建)
- [置顶] 设计模式之创建类模式——抽象工厂模式
- java 设计模式-创建模式之抽象工厂模式
- 设计模式之四:抽象工厂模式—产品族的创建
- 设计模式之创建类模式——抽象工厂模式
- 我的设计模式之旅(3)――抽象工厂模式AbstractFactory
- .NET设计模式:抽象工厂模式(Abstract Factory)
- 我的设计模式之旅(3)——抽象工厂模式AbstractFactory
- 学习TerryLee 的设计模式:抽象工厂模式(附源码)_AX
- 设计模式学习笔记(三)——Abstract Factory抽象工厂模式