工厂方法模式

         看书看到这个模型的时候,马上想到了之前学到的简单工厂模式,然后看了一下例子,觉得假如同样对于计算器来说的话,貌似简单工厂模式灵活一点,因为工厂类里包含了相关的逻辑判断。起码对于客户端而言,可以动态地选择条件来实例化相关的类。而工厂模式,貌似虽然使添加方法更加灵活,但是判断要实例化相关类的时候,却要在客户端里写判断逻辑。

         工厂方法模式(Factory Method)在书中的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。

         以下是实践书中的代码:

// 工厂方法.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

class Operation
{
	public:
      double numberA;
	  double numberB;

	  virtual double GetResult() = 0;
};

/**********************************************/
class OperationAdd : public Operation
{
	public:
	  double GetResult()
	  {
	     double result = 0.0;
	     result = numberA + numberB;
		 return result;
	  }
};

class OperationSub : public Operation
{
	public:
	  double GetResult()
	  {
	     double result = 0.0;
	     result = numberA - numberB;
		 return result;
	  }
};

class OperationMul : public Operation
{
	public:
	  double GetResult()
	  {
	     double result = 0.0;
	     result = numberA * numberB;
		 return result;
	  }
};

class OperationDiv : public Operation
{
	public:
	  double GetResult()
	  {
	     double result = 0.0;
		 if(numberB == 0)
		    cout<<"除数不能为0";
		 else
	     result = numberA / numberB;
		 return result;
	  }
};

class IFactory
{
    public:
	 virtual Operation *CreateOperation() = 0;
};

class AddFactory : public IFactory
{
	public:
	  Operation *CreateOperation()
	  {
	     return  new OperationAdd();
	  }
};

class SubFactory : public IFactory
{
	public:
	  Operation *CreateOperation()
	  {
	      return new OperationSub();		  
	  }
};

class MulFactory : public IFactory
{
	public:
	  Operation *CreateOperation()
	  {
	     return new OperationMul();
		  
	  }
};

class DivFactory : public IFactory
{
	public:
	  Operation *CreateOperation()
	  {
	     return new OperationDiv();
	  }
};

/************************************************/

int _tmain(int argc, _TCHAR* argv[])
{
    IFactory *operFactory = new AddFactory();
	Operation *oper = operFactory->CreateOperation();
	oper->numberA = 1;
	oper->numberB = 1;
	oper->GetResult();

	cout<<"a="<<oper->numberA<<endl;
	cout<<"b="<<oper->numberB<<endl;
	cout<<"result="<<oper->GetResult();
	system("pause");
	return 0;
}


         简单工厂的最大优点在于工厂类包含了必要的逻辑判断,从而去除了客户端与具体类的依赖,只需要根据需求传入一个“+”就会生成相关的类来执行相应的操作。但是也有一个缺点,就是如果我们要添加其他的方法,我们必须添加一个方法类,然后再修改工厂类里的逻辑判断,这样违反了开放-封闭原则。而工厂方法模式,则虽然把逻辑判断转移到客户端,但是它在添加方法的时候没有修改原来的工厂类,只是扩展需要添加的方法类而已,这个满足开放-封闭原则,而且还保持了封装对象创建过程的优点。但是这样就增加了客户端的压力。所以说,工厂方法应该是简单工厂的优化。在以后的学习过程中慢慢体会吧!!

       

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值