论坛首页 编程语言技术论坛

我看设计模式系列(1)--简单工厂模式【设计模式C++实现】

浏览 4070 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-03-01   最后修改:2010-05-31
C++

    无论是CSDN、博客园或者JAVAEYE,看着很多牛人工作、学习之余写心得写代码,为初学者提供方便。我不是大牛也不是精英。但我也是个过来人。说一说我的一些心得吧。

 

    关于设计模式,《大话设计模式》是我比较喜欢的一本书,不过这本书是C#语法写的例子,不懂C#的C++初学者们很期待能有C++版的源码。我在学习过程中,用C#和C++两种语言实现了本书中的所有例子。并把它放在一个DOC文档里,挂在CSDN上:http://download.csdn.net/source/1136752 ,下载量也算可以。看来学的人还是比较多。最近几天想把它整理一下,放在我的这个新博客里面,自己也顺便复习一下。

 

   关于设计模式的学习,建议先看一下《大话设计模式》和《Head First设计模式》,这两个比较容易入门,然后看经典的软工双雄里面的一本《设计模式》。最后可以看看《重构:改善既有代码的设计》。加上平时的练习和动脑,相信有一天能悟出一些自己独特的心得。

 

  好了,上面说了这么多,进入正题。今天只说一下最简单的简单工厂模式。我相信大家如果看《大话设计模式》的话,很容易明白。毕竟学IT的IQ都不低。放段C++的代码:

//运算操作基类
class COperation
{
public:
	int m_nFirst;
	int m_nSecond;
	virtual double GetResult() //返回操作结果
	{
		double dResult=0;
		return dResult;
	}
};
//加法
class AddOperation : public COperation
{
public:
	virtual double GetResult()
	{
		return m_nFirst+m_nSecond;
	}
};
//减法
class SubOperation : public COperation
{
public:
	virtual double GetResult()
	{
		return m_nFirst-m_nSecond;
	}
};

//工厂类,为了方便我用的静态函数
class CCalculatorFactory
{
public:
	static COperation* Create(char cOperator);
};

COperation* CCalculatorFactory::Create(char cOperator)
{
	COperation *oper;
	//在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?我觉得是RTTI,后面可以讲到
	switch (cOperator)
	{
	case '+':
		oper=new AddOperation();
		break;
	case '-':
		oper=new SubOperation();
		break;
	default:
		oper=new AddOperation();
		break;
	}
	return oper;
}

//客户端
int main()
{
	int a,b;
	cin>>a>>b;
	COperation * op=CCalculatorFactory::Create('-');
	op->m_nFirst=a;
	op->m_nSecond=b;
	cout<<op->GetResult()<<endl;
	return 0;
}

 

   上面的代码非常简单,请看下面UML图:

 

     简单工厂模式说简单点就是在一个工场类里面,根据输入的不同的条件产生同一类的不同对象,然后根据类的多态性使对象具有多样性。

 

                                                                                 @written by .cpp (转载请注明出处)

   发表时间:2010-03-16  
对于模式这方面的东西,, 我不大懂.. 不过一直有一个疑问: 难道 C语言就不能够实现设计模式之类的吗`?
0 请登录后投票
   发表时间:2010-04-21  
# COperation* CCalculatorFactory::Create(char cOperator) 
# { 
#     COperation *oper; 
#     //在C#中可以用反射来取消判断时用的switch,在C++中用什么呢?我觉得是RTTI,后面可以讲到 
#     switch (cOperator) 
#     { 
#     case '+': 
#         oper=new AddOperation(); 
#         break; 
#     case '-': 
#         oper=new SubOperation(); 
#         break; 
#     default: 
#         oper=new AddOperation(); 
#         break; 
#     } 
#     return oper; 
# } 
谁负责delete?哈哈。。。
c++不适合用这样的模式,除非有个好的内存管理框架
0 请登录后投票
   发表时间:2010-06-02  
是啊,谁负责删除哪???
0 请登录后投票
   发表时间:2010-07-01  
zhaoqj518 写道
是啊,谁负责删除哪???

谁负责创建,由谁负责删除

这里还可以改进一下,将由工厂创建的实例都管理起来,当工厂实例销毁的时候一起销毁。
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics