gof 抽象工厂工厂方法原型和Builder

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\n"; }
    virtual void Opt2() { std::cout << "def Builder::Opt2\n"; }

    virtual Product* Create() = 0;
};

class BuilderImpl1 : public Builder {
public:
    virtual void Opt1() { std::cout << "BuilderImpl1::Opt1\n"; }

    virtual Product* Create() {
        Opt1();
        Opt3();
        Opt2();
    }

private:
    void Opt3() { std::cout << "BuilderImpl1::Opt3\n" };
};
View Code

 

四、总结

//待续

 

以上是关于gof 抽象工厂工厂方法原型和Builder的主要内容,如果未能解决你的问题,请参考以下文章

GoF 23种设计模式之简单工厂模式工厂方法模式和抽象工厂模式

设计模式学习

设计模式系列-Builder模式,工厂方法模式和抽象工厂模式

GOF23种设计模式总览

设计模式

抽象工厂模式和原型模式之间的区别?