1、抽象工程模式(Abstract Factory)
适用性:一个系统由多个产品系列中的一个来配置。
类图:具体类图设计如下。client只需要关系产品系列的抽象类AbstractProductA,AbstractProductB。当使用产品系列中的factory1来配置该可获得时,A使用A1,B使用B1,当使用factory2来配置时,A使使用A2,B使用B2。可获得在初始化时确定使用new一个factory1或factory2来决定使用哪种工厂。
优点:易于交换产品系列。
缺点:难以支持产品 新种类,如需要CreateProductC,则修改较大。可以通过Make(int iType)来进行扩展。
2、对象创建型模式(Builder)
将对象的创建过程封装,单独提炼。builder着重的是一步步构造一个复杂对象。而抽象工厂着重与多个系列的产品对象。builder在最后一步返回产品。
builder.buildstep1(1, 2);
builder.buildstep2(3);
...
return builder.GetResult();
Client决定如何构建。构建后获取到想要的结果值。
当构造过程灵活多变时比较适用。
3、工厂方法(Factory Method)
适用型:当一个类不知道它所必须创建的对象的类的时候。只知道一些创建需求。
当一个类希望由它的子类来指定它所创建的对象的时候。
3.1、直接适用接口,通过参数区分
Product* create(ProductId id)
{
if (id == MINE) return new MyProduct;
else if(id == YOURS) return YourProduct;
...
return 0;
}
3.2、封装在类中,方便子类特殊实现
class Creator
{
virtual Product* Create(ProductId id);
}
4、原型模型(Prototype)
实现Clone接口。new this指针。传参this调用拷贝构造函数,进行克隆一个新的一样的对象。
Door* Door::clone() const
{return new Door(*this);}
适用性:当实例化的类在运行时刻指定时。
5、单件(Singleton)
总结:通常设计以工厂方法开始,通常不能满足或需要更加灵活时,会考虑其它模型的使用。