zoukankan      html  css  js  c++  java
  • PHP设计模式(三)抽象工厂模式(Abstract Factory)

    一、什么是抽象工厂模式

    抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足以下条件:

    1. 系统中有多个产品族,而系统一次只可能消费其中一族产品。
    2. 同属于同一个产品族的产品可以使用。

    产品族:位于不同产品等级结构中,功能相关联的产品组成的家族。下面例子的 汽车和空调就是两个产品树, 奔驰C200+格力某型号空调就是一个产品族, 同理, 奥迪A4+海尔某型号空调也是一个产品族。

    二、类图

    三、案例

    产品类
    // 汽车(抽象产品接口)
    interface AutoProduct
    {
        public function dirve();
    }
    
    
    //奥迪A4(具体产品类)
    class AudiA4Product implements AutoProduct
    {
        //获取汽车名称
        public function dirve()
        {
            echo "开奥迪A4"."<br>";
        }
    }
    
    //奔驰C200(具体产品类)
    class BenzC200Product implements AutoProduct
    {
        //获取汽车名称
        public function dirve()
        {
            echo "开奔驰C200"."<br>";
        }
    }
    
    
    
    //空调(抽象产品接口)
    interface AirCondition
    {
        public function blow();
    }
    
    //格力空调某型号(具体产品类)
    class GreeAirCondition implements AirCondition
    {
        public function blow()
        {
            echo "吹格力空调某型号"."<br>";
        }
    }
    
    //海尔空调某型号(具体产品类)
    class HaierAirCondition implements AirCondition
    {
        public function blow()
        {
            echo "吹海尔空调某型号"."<br>";
        }
    }
    
    工厂类
    //工厂接口
    interface Factory
    {
        public function getAuto();
        public function getAirCondition();
    }
    
    
    //工厂A = 奥迪A4 + 海尔空调某型号
    class AFactory implements Factory
    {
        //汽车
        public function getAuto()
        {
            return new AudiA4Product();
        }
    
        //空调
        public function getAirCondition()
        {
            return new HaierAirCondition();
        }
    }
    
    //工厂B = 奔驰C200 + 格力空调某型号
    class BFactory implements Factory
    {
        //汽车
        public function getAuto()
        {
            return new BenzC200Product();
        }
    
        //空调
        public function getAirCondition()
        {
            return new GreeAirCondition();
        }
    }
    
    客户端类
    //客户端测试代码
    $factoryA = new AFactory();
    $factoryB = new BFactory();
    
    //A工厂制作车
    $auto_carA = $factoryA->getAuto();
    $auto_airA = $factoryA->getAirCondition();
    
    //B工厂制作车
    $auto_carB = $factoryB->getAuto();
    $auto_airB = $factoryB->getAirCondition();
    
    //开奥迪车+吹海尔空调
    $auto_carA->dirve();
    $auto_airA->blow(); //热的时候可以吹吹空调
    
    //开奔驰车+吹格力空调;
    $auto_carB->dirve();
    $auto_airB->blow(); //热的时候可以吹吹空调
    

    四、抽象工厂模式的组成

    1. 抽象工厂(AbstractFactory):确定工厂的业务范围。
    2. 具体工厂(ConcreteFactory):每个具体工厂对应一个产品族。具体工厂决定生产哪个具体产品对象。
    3. 抽象产品(AbstractProduct):同一产品等级结构的抽象类。
    4. 具体产品(ConcreteProduct):可供生产的具体产品。

    工厂方法模式:

    • 一个抽象产品类,可以派生出多个具体产品类。
    • 一个抽象工厂类,可以派生出多个具体工厂类。
    • 每个具体工厂类只能创建一个具体产品类的实例。

    抽象工厂模式:

    • 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
    • 一个抽象工厂类,可以派生出多个具体工厂类。
    • 每个具体工厂类可以创建多个具体产品类的实例。

      三种工厂的比较

    • 简单工厂 :用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
    • 工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
    • 抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

    参考

    系列源地址

    WilburXu/design_pattern

    系列目录

    1. PHP 设计模式概述
    2. PHP设计模式(一)简单工厂模式 (Simple Factory For PHP)
    3. PHP设计模式(二)工厂方法模式(Factory Method)
    4. PHP设计模式(三)抽象工厂模式(Abstract Factory)
    5. PHP设计模式(四)单例模式(Singleton)

    原文地址:https://segmentfault.com/a/1190000016659904

  • 相关阅读:
    项目结队开发---NABC分析(成员)
    梦断代码读后感(二)
    梦断代码读后感(一)
    首尾相连的循环数组求其子数组最大值
    子数组求和之大数溢出
    梦断代码读后感——终结
    软件工程结对开发——一维最大子数组求和溢出问题
    结对开发——求环形一维数组最大子数组的和
    结对开发——电梯调度问题需求分析
    软件工程——求二维数组所有子矩阵的和的最大值
  • 原文地址:https://www.cnblogs.com/lalalagq/p/9964815.html
Copyright © 2011-2022 走看看