Factory Method,Abstract Factory,Prototype,Builder属于对象创建模式。
motivation:在创建对象时,创建对象的具体类型经常变化;定义一个用于创建对象的接口,让子类来决定实例化哪个类,使得实例化延迟(目的是解耦,手段是虚函数)。
key interface or class:
1. product的基类接口;
2. factory的基类接口。
feature: product和factory的基类接口,facotry具体类返回new的具体product。
structure:
template codes:
//重构前
//在MainForm函数中常见出需要的splitter
class MainForm{
public:
void button_1(){
TxtSplitter* splitter = new TxtSplitter(); //此处存在紧耦合,且不支持未来变化
splitter->split();
}
}
//引入接口
class MainForm{
public:
void button_1(){
ISplitter* splitter = new TxtSplitter(); //此处存在紧耦合,但是支持未来变化
splitter->split();
}
}
//ISplitter接口
class ISplitter{
public:
virtual split()=0;
virtual ~ISplitter(){}
}
//实现具体的各种Splitter的类
class TxtSplitter: public ISplitter{
public:
virtual split(){
//TxtSplitter的split方法
}
};
//引入工厂模式后
class MainForm{
SplitterFactory* factory;
public:
void button_1(){
//解耦和,MainForm不知道具体的factory类;只需要调用者在使用时指定;
ISplitter* splitter = factory->createSplitter();
splitter->split();
}
}
//工厂基类
class SplitterFactory{
public:
virtual ISplitter* createFactory()=0;
virtual ~createFactory(){}
}
//具体的工厂类
class TxtSplitterFactory{
public:
virtual ISplitter* TxtSplitterFactory(){
return new TxtSplitter();
}
}
summary:
1. factory method用于隔离类型的使用者和具体类型之间的耦合关系(具体类型经常变化时,紧耦合会使软件十分脆弱);
2.factory method将对象的创建延迟到了子类;
3.factory method解决单个对象的需求变化,缺点是需要的参数必须相同;
2.内存管理时,对象可以在factory中提供release的函数,也可以在使用后delete。