您的位置:首页 > 其它

设计模式 创建模式之抽象工厂模式

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的接口程序代码

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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: