白话设计模式之:工厂模式(Factory)

白话设计模式之:工厂模式(Factory)
               ---CSDN 老骆驼

Factory Method(工厂模式)

所属类型:创建性,何谓创建性呢?大家意会下...

工厂模式的意图是:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。(不是我说的,我抄别人的,写的很干瘪,也只能这么写,现在可以不要管他是什么意思)

工厂模式适合什么场景:

1.当一个类不知道它所必须创建的对象的类的时候。

2.当一个类希望由它的子类来指定它所创建的对象的时候。

3.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类

4.是代理者这一信息局部化的时候。

可能你会感觉还是不明白他在说什么,很正常,看看例子,再来看他的意思可能会更深刻,这也是所有程序员最希望的方式。上面可谓是理论。下面我们来实践。

场景设置:如今软件都特别漂亮,QQ,MSN,包括邮箱设置等等。其实他们都有换肤功能。比如我可喜欢红色。我喜欢蓝色,比如我早上喜欢红色,我下午喜欢蓝色。所以软件必须要满足多元化的需求嘛。咱们的场景就是这样,当然很多设计模式的书上也是采用这个场景。因为他比较好理解。咱们一样采用它:软件皮肤设置。咱们姑且定义三种风格:蓝色风格(让人安静的颜色),红色风格(让人骚动的颜色),灰色风格(老年人的颜色),括号内部东西不用看,纯属胡扯。

编程之旅:
我们新建一个win32控制台程序(如无特别说明,以后我们开发语言采用c++的win32控制台程序,其实其他语言也一样)。

我们设计了三种风格那么我们就需三个类去实现它

//蓝色风格 class BlueStyle { }; //红色风格 class RedStyle { }; //灰色风格 class GrayStyle { };

这三个类其实方法应该一样吧。肯定一样嘛!这时候我们就想,如果一样我是不可以给他们构建一个基类呢?你很聪明当然可以。好。我们来构建一下。

class FrmStyle
{
public:
 virtual void ShowSytle();
};

方法有很多但是我们就写一个方法了,还有因为子类要重载它,所以需要设置成虚函数。

那么跟着我们上面写的三个类也要做相应的变化,直接给出:
//蓝色风格 class BlueStyle:public FrmStyle { public: void ShowSytle() { cout << "BlueStyle" << endl; }; }; //红色风格 class RedStyle: public FrmStyle { public: void ShowSytle() { cout << "RedStyle" << endl; }; }; //灰色风格 class GrayStyle: public FrmStyle { public: void ShowSytle() { cout << "GrayStyle" << endl; }; };

如果不考虑什么模式的话其实我们已经可以实现换肤功能了,且看main函数

int style =0; int main(int argc, char* argv[]) { FrmStyle *f = new RedStyle();//相当于系统模式皮肤 if (style ==0) { f = new BlueStyle(); } else if (style ==1) { f = new RedStyle(); } else if (style ==2) { f = new GrayStyle(); } f->ShowSytle(); return 0; }

这样我们就可以实现换肤了,通过改变style的值。但是程序是不是很复杂呢?我们分析下。一个程序有多少个Frm或者说Frm的子类Button什么的我们是不是都要在生产这些窗体的时候都加上上面的这些代码?看来是很复杂,那么我们能不能把上面的代码单独放到一个地方呢?很聪明,工厂模式就是要解决这个问题。

下面我们定义一个工厂:

//蓝色工厂 class BlueFactory: public Factory { public: FrmStyle* GetStyle() { return new BlueStyle(); } }; //红色工厂(不要想歪哦) class RedFactory: public Factory { public: FrmStyle* GetStyle() { return new RedStyle(); } }; //灰色工厂 class GrayFactory: public Factory { public: FrmStyle* GetStyle() { return new GrayStyle(); } };

OK工厂建好了,那么我们怎么用呢?
且看main函数

Factory* m_factory = new GrayFactory();//程序需要维护一个全局唯一工厂 int main(int argc, char* argv[]) { //现在我有一个按钮,我怎么用呢? FrmStyle* f = m_factory->GetStyle();//我不知道什么风格,我只要问工厂要就是了。 f->ShowSytle(); return 0; } 

白话设计模式之:工厂模式(Factory)_第1张图片

 是不是很简单,以后只要用户修改了风格,我们在所有的窗体构造之前只要调用一下m_factory->GetStyle();就ok了。

我会继续写下去。直到把所有的设计模式讲完。

最后,转载请注明。

 

你可能感兴趣的:(白话设计模式之:工厂模式(Factory))