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

四、总结

//待续

原文地址:https://www.cnblogs.com/cxiaoln/p/5204948.html