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

    四、总结

    //待续

  • 相关阅读:
    在WCF中使用Flag Enumerations
    WCF开发教程资源收集
    [转]WCF 4 安全性和 WIF 简介
    Asp.Net Web API 2 官网菜鸟学习系列导航[持续更新中]
    Asp.Net Web API 2第十八课——Working with Entity Relations in OData
    Asp.Net Web API 2第十七课——Creating an OData Endpoint in ASP.NET Web API 2(OData终结点)
    Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
    Asp.Net Web API 2第十五课——Model Validation(模型验证)
    函数 生成器 生成器表达式
    函数的进阶
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/5204948.html
Copyright © 2011-2022 走看看