关于工厂创建问题,一个纠结的终结源于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资源(客户使用成品)
转载于:https://www.cnblogs.com/neking/archive/2012/11/16/2773511.html
关于工厂创建问题,一个纠结的终结源于KFC相关推荐
- 利用抽象工厂创建DAO、利用依赖注入去除客户端对工厂的直接依赖、将有关Article的各种Servlet封装到一个Servlet中(通过BaseServlet进行
利用抽象工厂创建DAO.利用依赖注入去除客户端对工厂的直接依赖.将有关Article的各种Servlet全部封装到一个Servlet中(通过BaseServlet来进行ArticleServlet方法 ...
- spring (由Rod Johnson创建的一个开源框架)
你可能正在想"Spring不过是另外一个的framework".当已经有许多开放源代码(和专有)J2EEframework时,我们为什么还需要Spring Framework? S ...
- Flutter初体验(二)—— 创建第一个Flutter APP
Flutter初体验(二)--- 创建第一个Flutter APP 在第一篇文章 Flutter初体验(一)---Mac 安装配置,学习了配置 Flutter 开发环境,并运行了Demo项目,本篇根据 ...
- java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现
工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...
- 《软件架构与设计模式》关于 抽象工厂模式 的一个小例子
下面是题目的要求: 根据上面的要求,我首先是画出了UML类图: 接着,根据上面的UML类图写出源代码: 1.抽象产品类 该类定义了产品的共性,所有的具体产品都要实现这个类 1 abstract cla ...
- 设计模式 原型模式_原型设计模式:创建另一个小车
设计模式 原型模式 创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正冒险节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. ...
- 原型设计模式:创建另一个小车
创建对象确实是一个耗时的过程,也是一件昂贵的事情. 因此,我们现在正努力节省时间和金钱. 我们该怎么做? 克隆奇迹多莉 有人记得多莉吗? 是的,是绵羊,是第一个被克隆的哺乳动物. 好吧,我不想深入研究 ...
- 【Spring 工厂】反转控制与依赖注入、Spring工厂创建复杂对象3种方式
反转控制与依赖注入 反转控制 与 依赖注入 反转控制(IOC Inverse of Control) 依赖注入 (Dependency Injection - DI) Spring工厂创建复杂对象(3 ...
- 简单工厂创建不同几何图形(Java代码实例)
使用简单工厂模式设计一个可以创建不同几何图形(Shape),如Circle,Rectangle,Triangle等绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法:要求在绘制 ...
最新文章
- Python 第十五天 串讲
- mysql命令创建模式_mysql在命令行模式下创建数据库时要显式指定字符集
- 如何知道刚刚插入数据库那条数据的id
- WordPress备份的七种办法
- opencv videoio无法读取rstp_使用一行Python代码从图像读取文本
- COLLATE oracle,Sql 中Collate用法
- 【LeetCode笔记】234. 回文链表(Java、快慢指针、链表)
- ssh 脚本 空格字符转换
- Microblogging Freedom
- larvel nginx 配置
- 黄金为什么贵,黄金都有什么用处?
- 网络协议从入门到底层原理(6)应用层 - 域名、DNS、DHCP、HTTP(ABNF、HTTP报文格式、请求方法、头部字段、状态码、跨域)、代理、CDN
- mac 电脑 eclipse 启动停在 org.eclipse.debug.core 导致无法启动
- Pyhton学习——Day33
- Spring Boot2.x 的Druid连接池配置[附带监控]
- Cent 6.5中安装NFS、Rpcbind 实现共享主机文档。
- 如何实现施耐德Twido系列PLC远程上下载
- hook 微信公众号html,Xposed实时获取微信公众号推送
- 端午小长假出游,应季的热门玩法和特色住宿了解下
- golang中使用validator进行数据校验及自定义翻译器
热门文章
- 20210501:字符串与哈希表力扣专题学习记录
- linux添加sshkey,使用SSH密钥对连接Linux实例
- 当一盆植物在MIT成了精,不,它只是成了机器人
- 火爆GitHub:100天搞定机器学习编程(超赞信息图+代码+数据集)
- “Google只认钱!机器学习20年没进步”,CMU学者炮轰AI第一大厂
- 当,程序员突然想画画,AI+机器人就该登场了
- 深度学习入行门槛太低,不开心!
- 菜鸟网工工作中对Linux系统的一点体会
- Linux -单用户模式(忘记Linux的root密码)
- SQL系列(五)—— 排序(order by)