zoukankan      html  css  js  c++  java
  • 【PHP设计模式】创建型之抽象工厂(abstract factory)

    抽象工厂模式(abstract factory):

    意图:

      【GoF】提供一个创建一系列相关或相互依赖的接口,而无需指定他们具体的类

    动机:

       把创建者与产品实现分离。

    适用:

      一、一个系统要独立于它的产品的创建、组合与表示时。

      二、一个系统要由多个产品系列中的一个来配置时。

      三、当你要强调一系列相关产品对象的设计以便进行联合使用时。

      四、当你提供一个产品类库,而指向显示它们的接口而不是实现时。

    结构图:

      AbstractFactory:负责创建一个抽象产品对象的接口。CreateFactory:实现创建具体产品对象。AbstractFactory:为一类产品对象创建一个接口。ProductA1:定义一个将被具体的工厂创建的产品对象。

      在运行时刻创建一个CreateFactory的实例,这一个具体的工厂对象创建具有特定实现的产品对象。为创建不同的产品对象,客户使用不同的具体工厂。

    示例代码一:

    //抽象预约类
    abstract class ApptEncoder {
        abstract function encode();
    }
    //抽象代办事宜类
    abstract class TtdEncoder {
        abstract function encode();
    }
    //抽象联系人类
    abstract class ContactEncoder {
        abstract function encode();
    }
    //具体预约类
    class BloggsApptEncoder extends ApptEncoder {
        function encode() {
            return "Appointment data encoded in BloggsCal format
    ";
        }
    }
    //抽象代办事宜类
    class BloggsContactEncoder extends ContactEncoder {
        function encode() {
            return "Contact data encoded in BloggsCal format
    ";
        }
    }
    //抽象联系人类
    class BloggsTtdEncoder extends ApptEncoder {
        function encode() {
            return "Things to do data encoded in BloggsCal format
    ";
        }
    }
    //具体日历预约类
    class MegaApptEncoder extends ApptEncoder {
        function encode() {
            return "Appointment data encoded in MegaCal format
    ";
        }
    }
    //抽象工厂类
    abstract class CommsManager {
        const APPT    = 1;
        const TTD     = 2;
        const CONTACT = 3;
        abstract function getHeaderText();
        abstract function make( $flag_int );
        abstract function getFooterText();
    }
    //具体工厂类
    class BloggsCommsManager extends CommsManager {
        function getHeaderText() {
            return "BloggsCal header
    ";
        }
    
        function make( $flag_int ) {
            switch ( $flag_int ) {
                case self::APPT:
                    return new BloggsApptEncoder();
                case self::CONTACT:
                    return new BloggsContactEncoder();
                case self::TTD:
                    return new BloggsTtdEncoder();
            } 
        }
    
        function getFooterText() {
            return "BloggsCal footer
    ";
        }
    }
    
    $comms = new BloggsCommsManager();
    print $comms->getHeaderText();
    print $comms->make( CommsManager::APPT )->encode();
    print $comms->make( CommsManager::TTD )->encode();
    print $comms->make( CommsManager::CONTACT )->encode();
    print $comms->getFooterText();

     

    工厂方法与抽象工厂比较:

    工厂方法模式:

      一个抽象产品类,可以派生出多个具体产品类。

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

    抽象工厂模式:

       多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。

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

    区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

     

     

  • 相关阅读:
    [zhuanzai]Bean对象注入失败 .NoSuchBeanDefinitionException: No qualifying bean of type..
    Quartz框架介绍
    [转载]springboot--常用注解--@configration、@Bean
    [转载]ac mysql 无法远程连接
    【转载】总结:几种生成HTML格式测试报告的方法
    【转载】SELENIUM2支持无界面操作(HTMLUNIT和PHANTOMJS)
    Code Coverage for your Golang System Tests
    [转载]pytest学习笔记
    数据库系统概论-第一章
    数据库系统概论-目录篇
  • 原文地址:https://www.cnblogs.com/colorstory/p/2716749.html
Copyright © 2011-2022 走看看