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

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

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

首先,问题源自学习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资源(客户使用成品)

转载于:https://www.cnblogs.com/neking/archive/2012/11/16/2773511.html

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

  1. 利用抽象工厂创建DAO、利用依赖注入去除客户端对工厂的直接依赖、将有关Article的各种Servlet封装到一个Servlet中(通过BaseServlet进行

    利用抽象工厂创建DAO.利用依赖注入去除客户端对工厂的直接依赖.将有关Article的各种Servlet全部封装到一个Servlet中(通过BaseServlet来进行ArticleServlet方法 ...

  2. spring (由Rod Johnson创建的一个开源框架)

    你可能正在想"Spring不过是另外一个的framework".当已经有许多开放源代码(和专有)J2EEframework时,我们为什么还需要Spring Framework? S ...

  3. Flutter初体验(二)—— 创建第一个Flutter APP

    Flutter初体验(二)--- 创建第一个Flutter APP 在第一篇文章 Flutter初体验(一)---Mac 安装配置,学习了配置 Flutter 开发环境,并运行了Demo项目,本篇根据 ...

  4. java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现

    工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...

  5. 《软件架构与设计模式》关于 抽象工厂模式 的一个小例子

    下面是题目的要求: 根据上面的要求,我首先是画出了UML类图: 接着,根据上面的UML类图写出源代码: 1.抽象产品类 该类定义了产品的共性,所有的具体产品都要实现这个类 1 abstract cla ...

  6. 设计模式 原型模式_原型设计模式:创建另一个小车

    设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...

  7. 原型设计模式:创建另一个小车

    创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正努力节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. 好吧,我不想深入研究 ...

  8. 【Spring 工厂】反转控制与依赖注入、Spring工厂创建复杂对象3种方式

    反转控制与依赖注入 反转控制 与 依赖注入 反转控制(IOC Inverse of Control) 依赖注入 (Dependency Injection - DI) Spring工厂创建复杂对象(3 ...

  9. 简单工厂创建不同几何图形(Java代码实例)

    使用简单工厂模式设计一个可以创建不同几何图形(Shape),如Circle,Rectangle,Triangle等绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法:要求在绘制 ...

最新文章

  1. Python 第十五天 串讲
  2. mysql命令创建模式_mysql在命令行模式下创建数据库时要显式指定字符集
  3. 如何知道刚刚插入数据库那条数据的id
  4. WordPress备份的七种办法
  5. opencv videoio无法读取rstp_使用一行Python代码从图像读取文本
  6. COLLATE oracle,Sql 中Collate用法
  7. 【LeetCode笔记】234. 回文链表(Java、快慢指针、链表)
  8. ssh 脚本 空格字符转换
  9. Microblogging Freedom
  10. larvel nginx 配置
  11. 黄金为什么贵,黄金都有什么用处?
  12. 网络协议从入门到底层原理(6)应用层 - 域名、DNS、DHCP、HTTP(ABNF、HTTP报文格式、请求方法、头部字段、状态码、跨域)、代理、CDN
  13. mac 电脑 eclipse 启动停在 org.eclipse.debug.core 导致无法启动
  14. Pyhton学习——Day33
  15. Spring Boot2.x 的Druid连接池配置[附带监控]
  16. Cent 6.5中安装NFS、Rpcbind 实现共享主机文档。
  17. 如何实现施耐德Twido系列PLC远程上下载
  18. hook 微信公众号html,Xposed实时获取微信公众号推送
  19. 端午小长假出游,应季的热门玩法和特色住宿了解下
  20. golang中使用validator进行数据校验及自定义翻译器

热门文章

  1. 20210501:字符串与哈希表力扣专题学习记录
  2. linux添加sshkey,使用SSH密钥对连接Linux实例
  3. 当一盆植物在MIT成了精,不,它只是成了机器人
  4. 火爆GitHub:100天搞定机器学习编程(超赞信息图+代码+数据集)
  5. “Google只认钱!机器学习20年没进步”,CMU学者炮轰AI第一大厂
  6. 当,程序员突然想画画,AI+机器人就该登场了
  7. 深度学习入行门槛太低,不开心!
  8. 菜鸟网工工作中对Linux系统的一点体会
  9. Linux -单用户模式(忘记Linux的root密码)
  10. SQL系列(五)—— 排序(order by)