码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-02-21 15:44:41      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

一、定义

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

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

原型:类中有一个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

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!