zoukankan      html  css  js  c++  java
  • 工厂方法FactoryMethod 初步学习笔记

    一,意图

      定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

    二,别名

      虚构造器 Virtual Constructor

    三,适用性

    • 当一个类不知道它所必须创建的对象的类的时候。
    • 当一个类希望由它的子类来指定它所创建的对象的时候。
    • 当类将创建对象的职责委托给多个帮助子类的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

    四,结构

    工厂方法模式结构图

    五,示例

      如该模式的意图所示,工厂方法模式并不难理解。我们沿用抽象工厂模式的示例例子,观察改用工厂方法模式解决这个问题的区别以及其如何把客户代码从需要实例化的具体类中解耦:

    定义工厂方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44

    class
    {
    public:
    virtual ~Creator();

    virtual Result* ()
    {
    Result* p_result = new Result;
    p_result->SetProductA(MakeProductA());
    p_result->SetProductB(MakeProductB());
    return p_result;
    }
    virtual AbstractProductA* MakeProductA() = 0;
    virtual AbstractProductB* MakeProductB() = 0;
    };

    class ConcreteCreator1 : public Creator
    {
    public:

    AbstractProductA* MakeProductA() override
    {
    return new ConcreteProductA1;
    }
    AbstractProductB* MakeProductB() override
    {
    return new ConcreteProductB1;
    }
    };

    class ConcreteCreator2 : public Creator
    {
    public:

    AbstractProductA* MakeProductA() override
    大专栏  工厂方法FactoryMethod 初步学习笔记="function"> {
    return new ConcreteProductA2;
    }
    AbstractProductB* MakeProductB() override
    {
    return new ConcreteProductB2;
    }
    };
    使用工厂方法
    1
    2
    3
    4
    5
    6

    Creator* p_creator1 = new ConcreteCreator1;
    Result* p_result1 = p_creator1->CreateResult();

    Creator* p_creator2 = new ConcreteCreator2;
    Result* p_result2 = p_creator2->CreateResult();

      在C++中,可通过使用模板来避免创建子类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    template <typename T_ProductA, typename T_ProductB>
    class TemplateCreator : public Creator
    {
    public:

    AbstractProductA* MakeProductA() override
    {
    return new T_ProductA;
    }
    AbstractProductB* MakeProductB() override
    {
    return new T_ProductB;
    }
    };


    Creator* p_creator3 = new TemplateCreator<ConcreteProductA3, ConcreteProductB3>;
    Result* p_result3 = p_creator3->CreateResult();

    Creator* p_creator4 = new TemplateCreator<ConcreteProductA4, ConcreteProductB4>;
    Result* p_result4 = p_creator4->CreateResult();

      另外,可通过参数化工厂方法创建多种产品:

    1
    2
    3
    4
    5
    6
    AbstractProductC* ConcreteCreator::MakeProductC(Type label) override
    {
    if (label == 5) return ConcreteProductC5;
    if (label == 6) return ConcreteProductC6;
    return Creator::MakeProductC(label);
    }

      工厂方法并不只是被Creator调用,工厂方法也常常被运用在并行类层次(一个类将它的一些职责委托给一个独立类)的情况下:
    工厂方法下的并行类层次图
      通常,设计以使用工厂方法开始,因为相比于其它创建型模式(需要新的类)工厂方法仅需一个新的操作。当发现需要更大的灵活性时,我们便向其它创建型模式演化。

    六,相关

  • 相关阅读:
    Fragment之三:根据屏幕尺寸加载不同的Fragment 分类: H1_ANDROID 2013-11-15 21:37 1162人阅读 评论(0) 收藏
    Fragment之一:Fragment入门 分类: H1_ANDROID 2013-11-15 18:16 2799人阅读 评论(2) 收藏
    Github android客户端源代码分析之一:环境搭建 分类: H1_ANDROID 2013-11-12 22:47 2829人阅读 评论(0) 收藏
    《30天自制操作系统》03_day_学习笔记
    《30天自制操作系统》02_day_学习笔记
    《30天自制操作系统》01_day_学习笔记
    湖大OJ-实验D----两个数的互素判定
    湖大OJ-实验B----CFG是P成员
    湖大OJ-实验A---- ADFA的可判定性
    关闭WIN10向微软发送浏览历史
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12014074.html
Copyright © 2011-2022 走看看