zoukankan      html  css  js  c++  java
  • 设计模式之三:Abstract Factory(转)

    一、功能 
      提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

      二、结构图

      类厂最基本的结构示意图如下:

      在实际应用中,工厂模式可以扩充到很复杂的情况,如下图所示:

      三、优缺点

      优点:(1)封装创建过程。客户不用知道类厂是如何创建类实例的,工厂封闭了所有创建的细节。这样可选择不同的创建方法,增加了灵活性。 (2)将客户与具体类隔离,提高了各自的可重用性。 
      缺点:Factory类层次与具体类层次通常是平行的(即一一对应的)。增加一个具体类,一般也要相应地增加一个factory类,增加了系统复杂度。

      四、实现

      (1)Abstract Factory类中通常是一组Factory Method的集合。个人认为与Factory Method模式没有本质区别。 

      (2)通常可以把工厂作为单件。

      五、示例代码

        class AbstractProductA {}; // Product A
        class ProductA1 : public AbstractProductA {};
        class ProductA2 : public AbstractProductA {};
    
        class AbstractProductB {}; // Product B
        class ProductB1 : public AbstractProductB {};
        class ProductB2 : public AbstractProductB {};
    
        class AbstractFactory
        {
      public:
        virtual AbstractProductA* CreateProductA() = 0 ;// 创建ProductA
        virtual AbstractProductB* CreateProductB() = 0 ;// 创建ProductB
        } ;
    
      class ConcreteFactory1 : public AbstractFactory
      {
      public:
        virtual AbstractProductA* CreateProductA() { return newProductA1() ;}
        virtual AbstractProductB* CreateProductB() { return newProductB1() ; }
        static ConcreteFactory1* Instance() 
        {  static ConcreteFactory1 instance ;
           return &instance ;
        }      
    protected:     ConcreteFactory1() {}   private:     ConcreteFactory1(const ConcreteFactory1&) ;     ConcreteFactory1& operator=(const ConcreteFactory1&) ;   } ;   class ConcreteFactory2 : public AbstractFactory   {   public:     virtual AbstractProductA* CreateProductA() { return newProductA2() ; }     virtual AbstractProductB* CreateProductB() { return newProductB2() ; }     static ConcreteFactory2* Instance()
        {  static ConcreteFactory2 instance ;
          return &instance ;
        }   
    protected:     ConcreteFactory2() {}   private:     ConcreteFactory2(const ConcreteFactory2&) ;     ConcreteFactory2& operator=(const ConcreteFactory2&) ;   } ; 客户端代码:   // 第一种创建方法   AbstractFactory *pFactory = ConcreteFactory1::Instance() ;   AbstractProductA *pProductA = pFactory->CreateProductA() ;   AbstractProductB *pProductB = pFactory->CreateProductB() ;   // 第二种创建方法   pFactory = ConcreteFactory2::Instance() ;   pProductA = pFactory->CreateProductA() ;   pProductB = pFactory->CreateProductB() ;

      六、实例

      最早知道类厂的概念是在COM中,但当时也没想到这是如此重要的一种模式,在许多其他模式中都可以用到类厂模式。 COM中不能直接创建组件,这也是由COM的一个特性决定的:即客户不知道要创建的组件的类名。

  • 相关阅读:
    Java vs Python
    Compiled Language vs Scripting Language
    445. Add Two Numbers II
    213. House Robber II
    198. House Robber
    276. Paint Fence
    77. Combinations
    54. Spiral Matrix
    82. Remove Duplicates from Sorted List II
    80. Remove Duplicates from Sorted Array II
  • 原文地址:https://www.cnblogs.com/wangzhijun/p/3460718.html
Copyright © 2011-2022 走看看