一、定义
抽象工厂:有一个抽象的类。类中有多个接口来创建不同的对象。
工厂方法:有一个类。类中有一个接口来创建对象。
原型:类中有一个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; } };
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" }; };
四、总结
//待续
时间: 2024-10-13 17:49:06