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

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(); 
   }
}


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值