设计模式之简单工厂、工厂、抽象工厂
目录
简单工厂
工厂
抽象工厂
网上关于这3个模式的文章很多,这里主要是加入本人自己的通俗理解。
就好比造军舰,当你没有条件搞那么多造船厂的时候,只有一个造船厂,那你这个造船厂就得什么军舰都造。来了航母订单造航母,来了驱逐舰订单就造驱逐舰。这就是简单工厂模式。
当你发达了,有条件搞造船厂了,你就建了航母船厂、驱逐舰船厂、护卫舰船厂,他们各司其职。来了订单一看,是航母就交给航母船厂;是驱逐舰就交给驱逐舰船厂。这就是工厂模式。
再后来你面临严峻外部挑战,需要造舰队了,你给每个舰队都配了造船厂,每个船厂都可以造多类型军舰。东海舰队要负责一统河山,要打鬼子,要打鹰酱。所以东海舰队船厂需要造003、055。北海舰队负责渤海、黄海,拱卫京师。所以北海舰队船厂造001、054就够了。这就是抽象工厂模式。
题外话,
江南造船厂 代表产品:003型航母、055型万吨大驱、052D驱逐舰、039常规动力潜艇。
大连造船厂 代表产品:“辽宁”号航母、“山东”号航母、055型万吨大驱、052D驱逐舰。
沪东造船厂 代表产品:075型两栖攻击舰、071型综合登陆舰、054A护卫舰、726气垫登陆艇。
简单工厂
⭐ 简单工厂模式,其内部包含必要的逻辑判断,可以根据客户端的选择动态实例化相关的类。 |
- 对客户端来说去除了对具体产品的依赖,即客户端无需了解这些实例化的类是如何创建的。
- 但是一旦新增新的类的话,就需要去更改简单工厂中的逻辑,违背了开放-封闭原则。
class Warship { public: Warship() { std::cout << "Warship class construction" << endl; } virtual ~Warship() { std::cout << "Warship class destruction" << endl; } public: virtual void Completed() = 0; }; //航母 class Carrier :public Warship { public: Carrier() { std::cout << "Carrier construction" << endl; } ~Carrier() { std::cout << "Carrier destruction" << endl; } void Completed() { std::cout << "Carrier Completed! " <<endl; } }; //驱逐舰 class Destroyer: public Warship { public: Destroyer() { std::cout << "Destroyer construction" << endl; } ~Destroyer() { std::cout << "Destroyer destruction" << endl; } void Completed() { std::cout << "Destroyer Completed! " << endl; } }; //护卫舰 class Firgate : public Warship { public: Firgate() { std::cout << "Firgate construction" << endl; } ~Firgate() { std::cout << "Firgate destruction" << endl; } void Completed() { std::cout << "Firgate Completed! " << endl; } }; class WarshipSimpleFactory { public: Warship *CreateWarship(int nType) { Warship *oper; switch (nType) { case 1: oper = new Carrier; break; case 2: oper = new Destroyer; break; case 3: default: oper = new Firgate; break; } return oper; } }; int main() { //简单工厂模式 WarshipSimpleFactory *factory = new WarshipSimpleFactory(); Warship * warship = factory->CreateWarship(1); warship->Completed(); delete warship; warship = NULL; delete factory; factory = NULL; return 0; } |
工厂
⭐ 定义一个用于创建对象的接口,让子类决定实例化哪一个类。使一个类的实例化延迟到其子类。 |
- 当系统需要新增对象产品时,只需要新增一个具体对象以及具体对象工厂即可,无需更改其他工厂,符合开放-封闭原则。
- 核心在于抽象工厂类。
class Warship { public: Warship() { std::cout << "Warship class construction" << endl; } virtual ~Warship() { std::cout << "Warship class destruction" << endl; } public: virtual void Completed() = 0; }; //航母 class Carrier :public Warship { public: Carrier() { std::cout << "Carrier construction" << endl; } ~Carrier() { std::cout << "Carrier destruction" << endl; } void Completed() { std::cout << "Carrier Completed! " <<endl; } }; //驱逐舰 class Destroyer: public Warship { public: Destroyer() { std::cout << "Destroyer construction" << endl; } ~Destroyer() { std::cout << "Destroyer destruction" << endl; } void Completed() { std::cout << "Destroyer Completed! " << endl; } }; //护卫舰 class Firgate : public Warship { public: Firgate() { std::cout << "Firgate construction" << endl; } ~Firgate() { std::cout << "Firgate destruction" << endl; } void Completed() { std::cout << "Firgate Completed! " << endl; } }; class WarshipFactory { public: virtual Warship* CreateWarship() = 0; }; class CarrierFactory :public WarshipFactory { public: virtual Warship* CreateWarship() { return new Carrier(); } }; class DestoryFactory :public WarshipFactory { public: virtual Warship* CreateWarship() { return new Destroyer(); } }; class FirgateFactory :public WarshipFactory { public: virtual Warship* CreateWarship() { return new Firgate(); } }; int main() { //工厂模式 WarshipFactory *cfactory = new CarrierFactory(); Warship *cwarship = cfactory->CreateWarship(); cwarship->Completed(); delete cwarship; cwarship = NULL; delete cfactory; cfactory = NULL; WarshipFactory *dfactory = new DestoryFactory(); Warship *dwarship = dfactory->CreateWarship(); dwarship->Completed(); delete dwarship; dwarship = NULL; delete dfactory; dfactory = NULL; WarshipFactory *ffactory = new FirgateFactory(); Warship *fwarship = ffactory->CreateWarship(); fwarship->Completed(); delete fwarship; fwarship = NULL; delete ffactory; ffactory = NULL; return 0; } |
抽象工厂
⭐ 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。 |
class Warship { public: Warship() { std::cout << "Warship class construction" << endl; } virtual ~Warship() { std::cout << "Warship class destruction" << endl; } public: virtual void Completed() = 0; }; //001航母 class Carrier001 :public Warship { public: Carrier001() { std::cout << "Carrier001 construction" << endl; } ~Carrier001() { std::cout << "Carrier001 destruction" << endl; } void Completed() { std::cout << "Carrier001 Completed! " << endl; } }; //003航母 class Carrier003 :public Warship { public: Carrier003() { std::cout << "Carrier003 construction" << endl; } ~Carrier003() { std::cout << "Carrier003 destruction" << endl; } void Completed() { std::cout << "Carrier003 Completed! " << endl; } }; //055驱逐舰 class Destroyer055 : public Warship { public: Destroyer055() { std::cout << "Destroyer055 construction" << endl; } ~Destroyer055() { std::cout << "Destroyer055 destruction" << endl; } void Completed() { std::cout << "Destroyer055 Completed! " << endl; } }; //054驱逐舰 class Destroyer054 : public Warship { public: Destroyer054() { std::cout << "Destroyer054 construction" << endl; } ~Destroyer054() { std::cout << "Destroyer054 destruction" << endl; } void Completed() { std::cout << "Destroyer054 Completed! " << endl; } }; class AbstractWarshipFactory { public: virtual Warship* CreateCarrier() = 0; virtual Warship* CreateDestroy() = 0; }; //东海舰队的造船厂 class DHJDFactory :public AbstractWarshipFactory { public: virtual Warship* CreateCarrier() { return new Carrier003(); } virtual Warship* CreateDestroy() { return new Destroyer055(); } }; //北海舰队的造船厂 class BHJDFactory :public AbstractWarshipFactory { public: virtual Warship* CreateCarrier() { return new Carrier001(); } virtual Warship* CreateDestroy() { return new Destroyer054(); } }; int main() { //抽象工厂模式 AbstractWarshipFactory *dhjdfactory = new DHJDFactory(); Warship *dCarrier = dhjdfactory->CreateCarrier(); dCarrier->Completed(); Warship *dDestroy = dhjdfactory->CreateDestroy(); dDestroy->Completed(); delete dCarrier; dCarrier = NULL; delete dDestroy; dDestroy = NULL; AbstractWarshipFactory *bhjdfactory = new BHJDFactory(); Warship *bCarrier = bhjdfactory->CreateCarrier(); bCarrier->Completed(); Warship *bDestroy = bhjdfactory->CreateDestroy(); bDestroy->Completed(); delete bCarrier; bCarrier = NULL; delete bDestroy; bDestroy = NULL; return 0; } |
设计模式之简单工厂、工厂、抽象工厂相关推荐
- 设计模式--简单工厂VS工厂VS抽象工厂
前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式.我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单 ...
- C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)
今天开始这个系列之前,心里有些恐慌,毕竟园子里的高手关于设计模式的经典文章很多很多,特别是大侠李会军.吕震宇 老师的文章更是堪称经典.他们的文笔如行云流水,例子活泼生动,讲解深入浅出.好在他们都是用C ...
- Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式
本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...
- 设计模式:简单工厂、工厂、抽象工厂
2014年读过有关设计模式的书籍,当时在写C#程序,很受益. 可惜,当时没有再深入.仔细地研读和总结,后面基本上没有写代码了,也就没有看了. 去年开始学习使用PHP,需要把这一块认真地捡起来了. 虽然 ...
- (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现
简介 设计模式是为了解决一些出现的问题设计的解决方案.是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法.使用不同的设计模式可以解决不同的问题. 设计模式可以分为三种大类别:分别是创建型 ...
- JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂——理解“开放封闭”
JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂--理解"开放封闭" 一个不简单的简单工厂引发的命案 在实际的业务中,我们往往面对的复杂度并非数个类 ...
- 简单工厂、工厂、抽象工厂
简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪 ...
- 简单工厂 工厂方法 抽象工厂
[找到一篇好文章] 作者:海粟007 原文址:http://www.cnblogs.com/Seasky/archive/2009/04/28/1385609.html 今天开始这个系列之前,心里有些 ...
- 简单工厂和抽象工厂有什么区别?
简单工厂和抽象工厂有什么区别? 简单工厂模式 是由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数的创建不同的对象实例 可以生产结构中的任意产品,不能增加新的产品 抽象 ...
- 简单工厂 工厂方法 抽象工厂 如何理解
文章目录 前言 一.简单工厂 二.工厂方法 三.抽象工厂 总结 前言 简单工厂,工厂方法,抽象工厂,三者有什么区别? 搞清楚他们有什么弊端,以发展的角度去观察,理解会更加深入. 提示:以下是本篇文章正 ...
最新文章
- python在中国的发展-Python未来的发展前景到底如何?
- Android Studio下加入百度地图的使用 (一)——环境搭建
- python随机大小写字符串_python 随机产生特定类型字符的函数(大写、小写、数字)...
- 拉格朗日乘子法 KKT条件
- leetcode 553. Optimal Division | 553. 最优除法(暴力递归->傻缓存)
- BZOJ3427 Poi2013 Bytecomputer
- mysql 开发复制协议_MySQL组复制MGR(一)– 技术概述
- python程序设计试题库_最新《Python程序设计》试题库资料
- chapter8.1、面向对象
- 如何查找Steam好友代码(以及添加好友代码)
- html css样式没有效果图,5个Blockquote的css样式
- 挖个大坑:挑战用纯micropython写一个nes模拟器(一)
- android 短信 易用性总结,详解短信验证和邮件验证的区别
- 微信小程序模板消息群发、无限制推送相关讲解
- 计算机课说话检查200字,上课说话检讨书200字
- 谷歌地图高清卫星地图、电子地图和地形图有什么区别?
- 2019年趋势科技校园招聘-附内推码(社招的可以私我)
- IT人生nbsp;需要指引lt;转自:51ctogt;
- 1-10-RHEL6.3-linux启动原理及各种故障案例分析(Red Hat Enterprise Linux Server6.3)@树袋飘零...
- r语言读取C盘的csv文件,R语言开发之CSV文件的读写操作实现