zoukankan      html  css  js  c++  java
  • 设计模式——抽象工厂模式详解

    0.前言

    写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~

    无论是工厂方法模式,还是抽象工厂模式,都属于工厂模式,在形式和特点上很相近,他们的最终目的都是为了解耦

    为了方便理解,看此篇之前请先理解工厂方法模式,可以阅读我之前写过的设计模式——工厂方法模式详解

     

    了解完工厂方法模式我们会发现:

    1)多个具体产品类都衍生自同一个接口或抽象类。

    2)一个抽象工厂类,可以派生出多个具体工厂类。

    3)并且每个具体工厂类只能创建一个具体产品类的实例。

     

    而抽象工厂模式是上述模式的升级版:

    1)多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。(看了后面的例子自然会懂~)

    2)一个抽象工厂类,可以派生出多个具体工厂类。(同工厂方法模式)

    3)并且每个具体工厂类可以创建多个具体产品类的实例。(看了后面的例子自然会懂~)

     

    1.抽象工厂模式模式介绍

    抽象工厂模式定义:

    为创建一组相关或者是相互依赖的对象提供的一个接口,而不需要指定它们的具体类。

    这个定义很抽象,不急,可以看完实例再返回来看一遍。

     

    抽象工厂模式包括的角色:

    1抽象产品类:为各种产品声明抽象接口或抽象类

    2具体产品类:抽象产品类的实现类,为实现某个具体产品的对象。

    3抽象工厂类:声明了一组(注意是一组,看了下面的例子就会明白和工厂方法模式的区别)用于创建一种产品(每一个方法对应一种产品)的方法。

    4具体工厂类:继承抽象工厂类,生成一组具体产品(注意是一组,这很重要)。


    2. 抽象工厂模式的实现

    下面是利用工厂方法模式生产两款车子”的实例介绍,便于理解该模式如何运用。

    在本例中,有两款车内空调品牌,分别为海尔和格力。也有两种发动机品牌,分别为国产和进口。

    (这就是一开始所说的,抽象工厂模式有多个产品抽象类,分别为空调抽象类和发动机抽象类

    然后在本例中,对于A类车,搭载的是海尔空调和进口发动机。对于B类车,搭载的是格力空调和国产发动机。


    2.1 产品抽象接口和实现 

    下面是空调类。

    public interface Air_conditioner { 
    void work();
    }
       
    //具体产品Air_conditioner_Haier,Air_conditioner_Gree 
    public class Air_conditioner_Haier implements Air_conditioner {       
    @override   
     public void work() {      
      System.out.println(" Air_conditioner_Haier is working ...");      
     }      
    }      
    public class Air_conditioner_Gree implements Air_conditioner {       
    @override   
     public void work() {      
      System.out.println(" Air_conditioner_Gree is working ...");      
     }      
    }  
    

    下面是发动机类。

    public interface Engine { 
    void work();
    }      
    //具体产品Engine_Import,Engine_Domestic      
    public class Engine_Import implements Engine {      
    @override   
     public void work() {      
      System.out.println(" Engine_Import is working...");      
     }      
    }      
    public class Engine_Domestic implements Engine {      
    @override  
     public void work() {      
      System.out.println(" Engine_Domestic is working. ...");      
     }      
    }
    

    2.2 抽象工厂接口与实现

    public interface Abstract_CarFactory {      
     public install_air_conditioner();      
     public install_engine();      
    }      
    //具体工厂A类    
    public class CarA implements AbstractFactory {      
     public install_air_conditioner () {      
      return new Air_conditioner_Haier();      
     }      
     public install_engine () {      
      return new Engine_Import();
     }      
    }
    //具体工厂B类    
    public class CarB implements AbstractFactory {      
     public install_air_conditioner () {      
      return new Air_conditioner_Gree();      
     }      
     public install_engine () {      
      return new Engine_Domestic();
     }      
    }  
    


    2.3 使用时

    Abstract_CarFactory factoryA = new CarA();
    factoryA. install_air_conditioner.work();
    factoryA. install_engine().work();
    
    Abstract_CarFactory factoryB = new CarB();
    factoryB. install_air_conditioner.work();
    factoryB. install_engine().work();


    3.  抽象工厂模式的优缺点

    抽象工厂模式的优点:

    1)具有工厂方法模式解耦的优点

    2)工厂模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构的。

    最主要的是可以在类内部对产品族关联关系进行定义和描述。

    【重要拓展概念】

    产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。

    举例说明,EngineAEngineB即为两个不同的等级结构,他们都衍生于Engine类。但是这里有海尔、格力两种空调,并且这两种空调都搭载到两种车子内(从这两个维度看,是有四种类型的车子了)。

    那么搭载海尔空调的AB两款车子就属于同一个产品族,搭载格力空调的AB两款车子就属于另一个产品族。

     

    抽象工厂模式的缺点:

    1)产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。

    2)在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一款车子不可以搭载两种空调。


  • 相关阅读:
    PHP面向对象----- 类的自动加载
    PHP基础知识------页面静态化
    Laravel 开发环境搭建
    jenkins相关学习
    markdown语法学习强化
    bind 使用和配置记录
    关于整形和浮点型的格式输出
    函数体中定义的结构体和类型
    Volatile & Memory Barrier
    各种简单排序算法模版
  • 原文地址:https://www.cnblogs.com/qitian1/p/6461555.html
Copyright © 2011-2022 走看看