设计模式1:简单工厂模式学习
算起来,俺从开始学c++到现在,也有大概7年了,即从大一就开始学习c++语言程序设计了。虽然对编程很感兴趣,但由于不是科班(生物医学工程专业),所以锻炼的机会自然较少一些。这期间,零零散散做过一些课程设计:图形图像处理的等等都用到了c++语言,但大多还是依葫芦画瓢,现在回想起来,那时写的code真是惨不忍睹啊。后来读研期间,跟随导师做了两年项目,算是感觉有些入门了。但是现在回想起来,以前项目中所写的c++code,大多还是以面向过程的思维去coding,所以code写的还是很糟糕,很难扩展和维护。回头想想,自己的基础还是不够扎实,而且缺少积累的习惯:从来不写日记,经常有想写博客的想法,但却一直没有实现。这不得不说是一个悲剧。于是乎,在阿里呆了快半年了,感觉还是有必要适时把自己的学习、感受等等记录下来,这样等到俺退出IT之时,也可以回头翻翻看自己都做了些什么。
首先从设计模式开始吧。
最近开始读 《大话设计模式》这本书,感觉相当不错,写的很通俗易懂,很精彩。
简单工厂模式
简单工厂模式是比较容易理解的一种软件设计方法:它所解决的是如何去实例化对象的问题,也就是说,到底要实例化谁,将来会不会增加实例化的对象,将这些容易变化的地方,用一个单独的类来做这个创造实例的过程,这就是工厂factory。
回想起来,俺当初在做一个跟数据采集相关的项目时,遇到一个需求:数据传输板有两种,一种是USB2.0,另外一种是PCI,而程序当中需要同时支持这两种传输板。两种传输板完成的功能是一样的:即将采集的数据源源不断的传输给PC机。对于PC机上的client端来说,它并不需要知道实现传输的细节,因此要最大化的减轻客户端的职责。俺当初并不懂设计模式,对设计模式根本没啥概念,就按照自己的想法,利用c++的虚函数特性,抽象出一个接口类IReader,并依此分别实现了PCI和USB两个reader的子类:
class IReader
{
virtual void ReadData()=0;
。。。
};
class PCIReader : public IReader
{
/*override*/ void ReadData();
。。。
};
class USBReader : public IReader
{
/*override*/ void ReadData();
。。。
};
再实现一个ReaderFactory类:
class ReaderFactory
{
IReader* CreateReader(string strMode)
{
switch (strMode)
{
case "PCI":
return new PCIReader();
case "USB":
return new USBReader();
}
}
};
所以说,简单工厂模式其实真的很简单:将对外提供同一性质服务的对象的创建交给factory来完成,这样最大化的减轻与客户端的耦合。根据我的理解,在应用这种模式的时候,最重要的部分就是如何对方法进行抽象,并进而得到一个基类(作为接口类)。