关于工厂创建问题,一个纠结的终结源于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资源(客户使用成品)