• 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

    四、总结

    //待续

  • 相关阅读:
    [OC] UITabBarController
    ARC forbids explicit message send of release
    ios opensource YiYuanGou
    js添加创建节点和合并节点
    js数组反转
    JQuery中$.ajax()方法参数详解
    js按钮点击展开收起
    window.location.hash属性介绍
    js获取节点
    查询网址字符串参数用数组输出
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/5204948.html
Copyright © 2020-2023  润新知