工厂方法模式

概念

工厂方法模式同样属于类的创建型模式又被称为多态工厂模式

工厂方法模式的意义

定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。 核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类 必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。

工厂方法模式的角色和职责

抽象工厂(Creator)角色

工厂方法模式的核心,任何工厂类都必须实现这个接口。

具体工厂( Concrete Creator)角色

具体工厂类是抽象工厂的一个实现,负责实例化产品对象。

抽象(Product)角色

工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(ConcreteProduct)角色

工厂方法模式所创建的具体实例对象

工厂方法模式的实现

#include<iostream>
using namespace std;//抽象水果
class AbstractFruit{
public:virtual void ShowName() = 0;};//苹果
class Apple :public AbstractFruit{virtual void ShowName(){cout << "我是苹果" << endl;}
};//香蕉
class Banana :public AbstractFruit{
public:virtual void ShowName(){cout << "我是香蕉" << endl;}
};//梨子
class Pear :public AbstractFruit{
public:virtual void ShowName(){cout << "我是梨子" << endl;}
};//把工厂抽象出来
class AbstractFruitFactory{
public:virtual AbstractFruit* CreateFruit() = 0;};
//苹果工厂
class AppleFactiry :public AbstractFruitFactory{
public:virtual AbstractFruit *CreateFruit(){return new Apple;}
};
//香蕉工厂
class BananaFactory :public AbstractFruitFactory{
public:virtual AbstractFruit * CreateFruit(){return new Banana;}
};//梨子工厂
class PearFactory :public AbstractFruitFactory{
public:virtual AbstractFruit * CreateFruit(){return new Pear;}
};void test01(){AbstractFruitFactory *factory = NULL;AbstractFruit *fruit = NULL;//创建苹果工厂factory = new AppleFactiry;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;//创建一个香蕉工厂factory = new BananaFactory;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;//创建一个梨子工厂factory = new PearFactory;fruit = factory->CreateFruit();fruit->ShowName();delete fruit;delete factory;
}int main(void)
{test01();system("pause");return 0;
}

工厂方法模式的优点

  1. 不需要记住具体类名,有时不需要记住具体参数
  2. 实现了对象创建和使用的分离
  3. 系统的可扩展性也的非常好,无需修改接口和原类。

工厂方法模式的缺点

  1. 类的个数成本增加,导致类越来越多,增加维护成本
  2. 判断逻辑在客户端,需要自己判断新加的产品是否需要新建工厂。

工厂方法模式和简单工厂模式比较

  1. 工厂方法模式与简单工厂模式在结构上的不同不是很明显。工厂方法类的核心是一个抽 象工厂类,而简单工厂模式把核心放在一个具体类上。
  2. 工厂方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口, 或者有共同的抽象父类。
  3. 当系统扩展需要添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对 象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了“开放-封闭” 原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。工厂方法模 式退化后可以演变成简单工厂模式
简单工厂模式的适用场景

工厂方法模式的适用场景

设计模式---3(工厂方法模式的概念,工厂方法模式的实现,工厂方法模式和简单工厂模式比较)相关推荐

  1. JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  2. java web简单工厂模式_JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...

  3. 【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式

    创建型模式-工厂三兄弟 提示:个人学习总结,如有错误,敬请指正 文章目录 创建型模式---工厂三兄弟 一.简单工厂模式 1.简单工厂模式是什么? 2.UML图 3.实现方式 二.工厂(方法)模式 1. ...

  4. 2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

    本文简述了各大设计模式,并通过UML和代码详细说明.本文大约共 2.5W 字,建议收藏.下方是本文的目录: 一.设计模式的认识 二.设计模式的分类 根据其目的 根据范围 三.设计模式的优点 四.设计模 ...

  5. Java设计模式之(工厂模式)--简单工厂模式--工厂方法模式--抽象工厂模式

    工厂模式: 工厂模式可以分为三类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 简单工厂模 ...

  6. 设计模式 -- 简单工厂模式

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初识简单 ...

  7. C#设计模式之简单工厂模式(过渡模式)

    一.引言 之所以写这个系列,是了为了自己更好的理解设计模式,也为新手提供一些帮助,我都是用最简单的.最生活化的实例来说明.在上一篇文章中讲解了单例模式,今天就给大家讲一个比较简单的模式--简单工厂模式 ...

  8. 【C#设计模式】4-0. 简单工厂模式【创建型】

    [C#设计模式]总目录-共23种 [C#设计模式]简单工厂模式 前言 一.简单工厂模式定义 二.实例 三.进一步研究[违反开闭原则的解决方法] 四.简化简单工厂模式[将抽象产品类和工厂类合并] 五.简 ...

  9. 工厂方法模式和简单工厂模式的区别

    简单工厂模式 就我们的计算器例子来说,简单工厂模式的思想就是,创建一个运算类,创建一个简单工厂类. 运算类派生加法类.减法类.乘法类...... 简单工厂类主要是根据传入的符号字符串,做相应的条件判断 ...

  10. 手撕设计模式之「简单工厂模式」(Java描述)

    前言 利用简单工厂模式可以实现对象创建和业务逻辑处理的分离,但存在工厂类职责过重,增添新产品违背开闭原则等问题.它不属于GoF 23种设计模式之一,但是它可以作为学习工厂方法模式前的一个很好的引导. ...

最新文章

  1. 使用ASP.NET操作IIS7中使用应用程序
  2. oracle增加数据时报没安装java_在linux上安装Oracle Developer Tools for VS Code
  3. android学习笔记之ImageView的scaleType属性
  4. errno_t open_s()打开文件出现的错误分析
  5. Code Review 是苦涩但有意思的修行
  6. QueryRunner使用
  7. 性能测试系列:高可用测试linux常用命令
  8. 千方百剂创建账套服务器文件,千方百剂辅助工具使用手册(图解).doc
  9. 数据库 习题答案 系统概念 第七章
  10. 知乎推荐育儿书籍汇总
  11. 一则 HTTP 405 Method Not Allowed 的解决办法
  12. 基于STM32超声波测距
  13. canvas设计抽奖刮刮卡(非酋慎点) - Kaiqisan
  14. matlab s域转时域,时域 S域 Z域转换
  15. 华三防火墙web端口_HCL模拟器防火墙WEB方式登录配置
  16. word2013怎么去掉所有文字下面的波浪线
  17. 获得屏幕的宽度和高度
  18. 【沉痛悼念】首届国医大师唐由之逝世 | 曾为毛主席治疗白内障
  19. STM32F103ZE TFT液晶代码移植
  20. 数学建模查找资料的方法以及网站

热门文章

  1. js使用工具将表单封装成json字符串传到后台,js截取字符串(学生笔记)
  2. npm git 遇到的问题解决笔记
  3. Linux服务器配置---安装vsftpd
  4. 数据结构0类模板的使用
  5. JavaScript消息框
  6. QTP自传之web常用对象
  7. 初步体验数据驱动之美---TreeView
  8. java输出减法表,Calendarjava时间加减法和格式化输出
  9. linux的kerne启动过程,linux
  10. mysql sohu_【MySQL中间件之SOHU-DBProxy】