关于工厂创建问题,一个纠结的终结源于KFC

   关于工厂模式,抽象工厂的问题,工厂实例的创建问题我一直在纠结,纠结什么呢?

   工厂创建了对象实例,那么谁创建工厂呢?

   今天偶然间想通了,居然是源于一个汉堡。

    首先,问题源自学习CleanCode时第11章系统, 在关于将系统的构造与使用分离时提出的抽象工厂的解决方法。 main模块创建实例,而使用者模块通过抽象工厂的接口决定何时创建实例,即main模块知道如何创建实例,而抽象工厂告知main何时创建,做到构造与使用分离。

    然后,我的纠结就开始了, 使用者模块要调用抽象工厂的方法, 那么抽象工厂的实例怎么构造?是由main构造还是使用者模块构造?

  引用书中例子,某个订单处理系统,应用程序必须创建LineItem实体,添加到Order对象


图看懂了,那么LineItemFactoryImpl是在main中声明定义,

问题1:OrderProcessing是否要知道LineItemFactoryImpl的定义且创建一个该类的实例?

再又仔细看了上图后,发现main到LineItemFactoryImpl之间有条线写着<<create>>,哦至此,我明白了原来工厂实例也是由main创建。这样就与书中前一段符合了。

问题2:解决了工厂实例的构造,那么该实例如何引渡到OrderProcessing呢?

针对此尝试写了如下代码:

//mainmoudle.h
#include "lineitemfactoryinterface.h"
#include "lineitemfactoryimpl.h"
class mainmoudle
{
  LineItemFactory* m_lineItemFactory;
public:
  mainmoudle(): m_lineItemFactory(null) 
  {
	  m_lineItemFactory = new Lineitemfactoryimpl;
  }
};

//lineitemfactoryinterface.h
class LineItemFactory
{
public:
	virtual LineItem* makeLineItem() = 0;
};

//lineitemfactoryimpl.h
#include "lineitemfactoryinterface.h"
#include "lineItem.h"
class Lineitemfactoryimpl : public LineItemFactory
{
	public:
		virtual LineItem* makeLineItem()
		{
		   return new LineItem;
		}
};

//lineItem.h
class LineItem
{
};



//orderprocessing.h
#include "lineitemfactoryinterface.h"
class orderprocessing
{
	LineItemFactory* m_lineItemFactory;
 public:
	void run(const LineItemFactory* factory);
}

 

 问题3: 工厂创建出了LineItem实例,对于c++来说如果没有delete就出现内存泄漏? 怎么办?

这时候突然想起了去KFC 麦当劳买汉堡包的情景:

我饿了,要吃汉堡包, 来到KFC或者Macdonald,告诉服务生 我要一个香脆鸡腿堡 然后我付钱, 等2分钟拿着我的汉堡包满足的吃饭去了。

对于问题0, 我不知道汉堡包如何做,而KFC或者Macdonald知道如何做 (构造过程客户不知道)

对于问题2, KFC或者Macdonald的店谁建的我不关心,我只关心建在我周围的,我能找到且买到汉堡的就可以 (客户知道工厂)

对于问题3,KFC或者Macdonald做出了汉堡包,而我把它吃掉了,即我申请了汉堡包,它占用了空间,我把它吃了就是消灭了,释放了空间。 所以OrderPorcessing需要清理LineItem资源(客户使用成品)

 

posted @ 2012-11-16 16:34  让代码飞一会儿  阅读(196)  评论(0编辑  收藏  举报