zoukankan      html  css  js  c++  java
  • gof 抽象工厂、工厂方法、原型和Builder

    一、定义

    抽象工厂:有一个抽象的类。类中有多个接口来创建不同的对象。

    工厂方法:有一个类。类中有一个接口来创建对象。

    原型:类中有一个Clone接口来深度或者“半深浅”克隆自身的对象。

    Builder:类中有多个接口来操作各种复杂的步骤。还有一个接口用来或者通过各个步骤操作的组合而创建的对象。

    二、部分应用情况

    在刚开始的时候,一般使用工厂方法进行创建。在后期对需求进行扩展的时候视情况而定是需要使用何种扩展方法。

    抽象工厂:

    • 一个系统要独立于它的产品的创建、组合和表示时。
    • 一个系统要由多个产品系列中的一个来配置时。
    • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
    • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

    工厂方法:

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

    三、部分实现情况

    工厂方法:

    // 方式1
    class Creator {
    public:
        Product* Create(int id) {
            if (id == 1)
                return new ProductImpl1();
            return nullptr;
        }
    };
    
    class CreatorImpl1 : public Creator{
    public:
        Product* Create(int id) {
            if (id == 2)
                return new ProductImpl2();
    
            return __super::Create(id);
        }
    };
    
    // 方式2
    class Creator {
    public:
        Product* Create() = 0;
    };
    
    template<typename ProductType >
    class CreateImpl : public Creator {
    public:
        Product* Create() {
            return new ProductType;
        }
    };
    View Code

    Builder:

    class Product;
    class Builder {
    public:
        virtual void Opt1() { std::cout << "def Builder::Opt1
    "; }
        virtual void Opt2() { std::cout << "def Builder::Opt2
    "; }
    
        virtual Product* Create() = 0;
    };
    
    class BuilderImpl1 : public Builder {
    public:
        virtual void Opt1() { std::cout << "BuilderImpl1::Opt1
    "; }
    
        virtual Product* Create() {
            Opt1();
            Opt3();
            Opt2();
        }
    
    private:
        void Opt3() { std::cout << "BuilderImpl1::Opt3
    " };
    };
    View Code

    四、总结

    //待续

  • 相关阅读:
    C#学习笔记:多态与隐藏,覆盖
    HTML与XML数据的结合小总结
    基于角色(RoleBased)的表单验证
    去除C++String的首尾空格
    Bash Shell中命令行选项/参数处理
    linux shell 执行多个命令的几种方法
    gdb 多线程调试
    linux 时间戳及时间差计算
    oracle sql日期比较
    在Fedora 14上安装Sun JDK 6
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/5204948.html
Copyright © 2011-2022 走看看