目录

简单工厂

工厂

抽象工厂


网上关于这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;

}

设计模式之简单工厂、工厂、抽象工厂相关推荐

  1. 设计模式--简单工厂VS工厂VS抽象工厂

    前几天我一直在准备大学毕业生,始终绑起来,如今,终于有时间去学习设计模式.我们研究今天的话题是植物三口之家的设计模式的控制--简单工厂VS工厂VS抽象工厂. 经过细心推敲,我们不难得出:工厂模式是简单 ...

  2. C++设计模式之一 工厂模式(简单工厂、工厂和抽象工厂)

    今天开始这个系列之前,心里有些恐慌,毕竟园子里的高手关于设计模式的经典文章很多很多,特别是大侠李会军.吕震宇 老师的文章更是堪称经典.他们的文笔如行云流水,例子活泼生动,讲解深入浅出.好在他们都是用C ...

  3. Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...

  4. 设计模式:简单工厂、工厂、抽象工厂

    2014年读过有关设计模式的书籍,当时在写C#程序,很受益. 可惜,当时没有再深入.仔细地研读和总结,后面基本上没有写代码了,也就没有看了. 去年开始学习使用PHP,需要把这一块认真地捡起来了. 虽然 ...

  5. (创建模式 上)设计模式——工厂、抽象工厂 C++/Python3实现

    简介 设计模式是为了解决一些出现的问题设计的解决方案.是长时间经验的总结,是根据不同问题从而提出并且实践出来的解决办法.使用不同的设计模式可以解决不同的问题. 设计模式可以分为三种大类别:分别是创建型 ...

  6. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂——理解“开放封闭”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂--理解"开放封闭" 一个不简单的简单工厂引发的命案 在实际的业务中,我们往往面对的复杂度并非数个类 ...

  7. 简单工厂、工厂、抽象工厂

    简单工厂模式:专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类.它又称为静态工厂方法模式,属于类的创建型模式. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪 ...

  8. 简单工厂 工厂方法 抽象工厂

    [找到一篇好文章] 作者:海粟007 原文址:http://www.cnblogs.com/Seasky/archive/2009/04/28/1385609.html 今天开始这个系列之前,心里有些 ...

  9. 简单工厂和抽象工厂有什么区别?

    简单工厂和抽象工厂有什么区别? 简单工厂模式 是由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数的创建不同的对象实例 可以生产结构中的任意产品,不能增加新的产品 抽象 ...

  10. 简单工厂 工厂方法 抽象工厂 如何理解

    文章目录 前言 一.简单工厂 二.工厂方法 三.抽象工厂 总结 前言 简单工厂,工厂方法,抽象工厂,三者有什么区别? 搞清楚他们有什么弊端,以发展的角度去观察,理解会更加深入. 提示:以下是本篇文章正 ...

最新文章

  1. python在中国的发展-Python未来的发展前景到底如何?
  2. Android Studio下加入百度地图的使用 (一)——环境搭建
  3. python随机大小写字符串_python 随机产生特定类型字符的函数(大写、小写、数字)...
  4. 拉格朗日乘子法 KKT条件
  5. leetcode 553. Optimal Division | 553. 最优除法(暴力递归->傻缓存)
  6. BZOJ3427 Poi2013 Bytecomputer
  7. mysql 开发复制协议_MySQL组复制MGR(一)– 技术概述
  8. python程序设计试题库_最新《Python程序设计》试题库资料
  9. chapter8.1、面向对象
  10. 如何查找Steam好友代码(以及添加好友代码)
  11. html css样式没有效果图,5个Blockquote的css样式
  12. 挖个大坑:挑战用纯micropython写一个nes模拟器(一)
  13. android 短信 易用性总结,详解短信验证和邮件验证的区别
  14. 微信小程序模板消息群发、无限制推送相关讲解
  15. 计算机课说话检查200字,上课说话检讨书200字
  16. 谷歌地图高清卫星地图、电子地图和地形图有什么区别?
  17. 2019年趋势科技校园招聘-附内推码(社招的可以私我)
  18. IT人生nbsp;需要指引lt;转自:51ctogt;
  19. 1-10-RHEL6.3-linux启动原理及各种故障案例分析(Red Hat Enterprise Linux Server6.3)@树袋飘零...
  20. r语言读取C盘的csv文件,R语言开发之CSV文件的读写操作实现

热门文章

  1. html5手机视频直播
  2. Redis集群节点的变更
  3. uni-app封装缓存过期方法
  4. adrv9025 serdes jesd 调试资料 整理
  5. 阿里开源组件库--ant design of vue的安装和使用
  6. UG NX 8.5有限元分析入门与实例精讲(PPT、视频、模型)
  7. Wampserver32 mysql 出现拒绝访问,端口被占用问题
  8. 收益和亏损时的持仓观念
  9. 半小时学习最小二乘法
  10. 气动与PLC控制实验装置带机械手QY-QDSY01