zoukankan      html  css  js  c++  java
  • 设计模式之工厂模式之抽象工厂(php实现)

    github地址:

    git@github.com:ZQCard/design_pattern.git

    抽象工厂模式:

    先来认识下什么是产品族: 位于不同产品等级结构中,功能相关联的产品组成的家族。
    图中的BmwCar和BenzCar就是两个产品树(产品等级结构);而如图所示的BenzSportsCar和BmwSportsCar就是一个产品族。他们都可以放到跑车家族中,因此功能有所关联。同理BmwBussinessCar和BenzBusinessCar也是一个产品族。
    可以这么说,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。
    而且使用抽象工厂模式还要满足一下条件:
    1.系统中有多个产品族,而系统一次只可能消费其中一族产品
    2.同属于同一个产品族的产品以其使用。
    来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):
    抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。它由抽象类或者接口来实现。
    具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。
    抽象产品角色:它是具体产品继承的父类或者是实现的接口。一般有抽象类或者接口来实现。
    具体产品角色:具体工厂角色所创建的对象就是此角色的实例。由具体的类来实现。

    (1)Driver.class.php(抽象父类,用于规范子类实现)

    <?php
    
    namespace FactoryAbstractFactory;
    
    abstract class Driver
    {
        public abstract function driverBenzCar();
        public abstract function driverBwmCar();
    }

    (2)BenzCar.class.php(抽象父类,用于规范子类实现)

    <?php
    
    namespace FactoryAbstractFactory;
    
    abstract class BenzCar
    {
        public abstract function drive();
    }

    (3)BenzSportCar.class.php(具体实现类)

    <?php
    namespace FactoryAbstractFactory;
    
    class BenzSportCar extends BenzCar
    {
        public function drive()
        {
            return '开奔驰跑车';
        }
    }

    (4)BenzBusinessCar(具体实现类)

    <?php
    namespace FactoryAbstractFactory;
    
    class BenzBusinessCar extends BenzCar
    {
        public function drive()
        {
            return '开奔驰商务车';
        }
    }

    (5)BwmCar.class.php(抽象父类,用于规范子类实现)

    <?php
    
    namespace FactoryAbstractFactory;
    
    abstract class BwmCar
    {
        public abstract function drive();
    }

    (6)BwmSport.class.php(具体实现类)

    <?php
    namespace FactoryAbstractFactory;
    
    class BwmSportCar extends BenzCar
    {
        public function drive()
        {
            return '开宝马跑车';
        }
    }

    (7)BwmBusiness.class.php

    <?php
    namespace FactoryAbstractFactory;
    
    class BwmBusinessCar extends BenzCar
    {
        public function drive()
        {
            return '开宝马商务车';
        }
    }

    (8)BusinessDriver.class.php(具体产品族实现类)

    <?php
    
    namespace FactoryAbstractFactory;
    
    class BusinessDriver extends Driver
    {
        public function driverBenzCar()
        {
            return new BenzBusinessCar();
        }
        
        public function driverBwmCar()
        {
            return new BwmBusinessCar();
        }
    }

    (9)SportDriver.class.php(具体产品族实现类)

    <?php
    
    namespace FactoryAbstractFactory;
    
    class SportDriver extends Driver
    {
        public function driverBenzCar()
        {
            return new BenzSportCar();
        }
        
        public function driverBwmCar()
        {
            return new BwmSportCar();
        }
    }
    (10)客户端类
    <?php
    
    spl_autoload_register(function ($className){
        $className = str_replace('\','/',$className);
        include $className.".class.php";
    });
    
    use FactoryAbstractFactorySportDriver;
    
    $type = new SportDriver();
    $car = $type->driverBwmCar();
    $string = $car->drive();
    echo $string;


  • 相关阅读:
    JAVA 一个接口多个实现类
    关于Web服务器
    美团买菜IOS版设备风控浅析与算法还原
    阿里App防Bot新版AliTigerTally方案浅析与算法还原1
    使用php的openssl_encrypt和python的pycrypt进行跨语言的对称加密和解密问题
    一个把人民币小写转换为大写中文的方法
    《重构》代码坏味道
    git 合并分支
    java中SPI机制 代码改变世界
    echo print print_r的区别
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/9106142.html
Copyright © 2011-2022 走看看