工厂方法模式:
最近看设计模式看上瘾了,把论文看完然后再撸一个设计模式,爽歪歪!
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。
解决的问题:
- 在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。
- 绕过常规的对象创建方法(New),提供一种“封装机制”来避免客户程序和这种“具体对象 创建工作”的紧耦合。
结构如下:
Product是产品抽象基类,Creator是抽象出来的工厂,ConcreteProduct是具体的产品类,ConcreteCreator是具体的工厂
直接上代码:
这里是抽象类 :ISplitter && 具体类 :TxtSplitter and PictureSplitter
//抽象类
class ISplitter {
public:
virtual void split() = 0;
virtual ~ISplitter() {};
};
//具体类
class TxtSplitter :public ISplitter {
virtual void split() {
cout << "我是一个TxtSplitter" << endl;
};
};
class PictureSplitter :public ISplitter {
virtual void split() {
cout << "我是一个PictureSplitter" << endl;
};
};
这里是制造出来的工厂:
//工厂基类
class ISplitterFactory {
public:
virtual ISplitter* CreatSpliter() = 0;
virtual ~ISplitterFactory() {};
};
//具体工厂
class TxtSplitterFactory : public TxtSplitter {
public:
virtual ISplitter* CreatSpliter() {
cout << "我创建了一个TxtSplitter" << endl;
return new TxtSplitter();
};
virtual ~TxtSplitterFactory() {};
};
class PictureSplitterFactory : public PictureSplitter {
public:
virtual ISplitter* CreatSpliter() {
cout << "我创建了一个PictureSplitterFactory" << endl;
return new PictureSplitter();
};
virtual ~PictureSplitterFactory() {};
};
这里是使用接口的处理函数:process()
void process(ISplitterFactory* factory) {
/****************************** 多态new ************************************
* 1. splitter的类型取决于factory的工厂类型
* 2. splitter 与 ISplitterFactory 均为抽象基类,process()不依赖具体的类
****************************************************************************/
ISplitter* splitter = factory->CreatSpliter();
}
个人觉得该方法的优点是:当然都是我自己瞎琢磨的大白话,O(∩_∩)O哈哈~
- 延迟了具体类的实例化,使得处理函数处理的都是抽象的类型,减少了代码的维护负担,每当产品改变时,我们只需要对相应的产品类进行更改,而不需要更改处理函数。
- 客户端基本不用关心使用的是哪个产品,只需要知道用哪个工厂就行了,只需要传入对应的工厂便可以得到对应的产品。
说到最后,其实工厂模式还有一种处理可以实现相应的功能,我也是看别人博客上有这么写的:
//工厂基类
class ISplitterFactory {
public:
virtual ISplitter* CreatSpliter(string which_kind)
{
if(which_kind == "1")
return new TxtSplitter();
else if(which_kind == "2")
return new PictureSplitter();
};
virtual ~ISplitterFactory() {};
};
好了,我写完了,又十一点半了,滚回去睡觉啦,加油!