概述

在简单工厂模式中只提供一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它需要知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了“开闭原则”。此外,在简单工厂模式中,所有的产品都由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类之间的耦合度高,严重影响了系统的灵活性和扩展性,而工厂方法模式则可以很好地解决这一问题。在工厂方法模式中,我们不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构

定义

工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式是一种类创建型模式。

实现

Pizza接口及具体类

    public interface Pizza{/// <summary>/// 显示pizza信息方法/// </summary>void show();}

    public class CheesePizza : Pizza{/// <summary>/// 显示pizza信息方法/// </summary>public void show(){Console.WriteLine("Cheese");}}

    public class ClamPizza : Pizza{/// <summary>/// 显示pizza信息方法/// </summary>public void show(){Console.WriteLine("Clam");}}

工厂接口及具体类

    public interface PizzaFactory{Pizza GetPizza();}

    public class CheesePizzaFactory : PizzaFactory{public Pizza GetPizza(){return new CheesePizza();}}

    public class ClamPizzaFactory : PizzaFactory{public Pizza GetPizza(){return new ClamPizza();}}

客户端调用

        static void Main(string[] args){//根据需求实例化具体的PizzaFactory对象PizzaFactory pizzaFactory = new CheesePizzaFactory();Pizza pizza = pizzaFactory.GetPizza();pizza.show();Console.ReadLine();}

工厂方法模式总结

工厂方法模式是简单工厂模式的延伸,它继承了简单工厂模式的优点,同时还弥补了简单工厂模式的不足。工厂方法模式是使用频率最高的设计模式之一,是很多开源框架和API类库的核心模式。

主要优点

1、在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须关心创建细节,甚至无须知道具体产品类的类名。

2、基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。它能够让工厂可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部。工厂方法模式之所以又被称为多态工厂模式,就正是因为所有的具体工厂类都具有同一抽象父类。

3、使用工厂方法模式的另一个优点是在系统中加入新产品时,无须修改抽象工厂和抽象产品提供的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了,这样,系统的可扩展性也就变得非常好,完全符合“开闭原则”。

主要缺点

1、在添加新产品时,需要编写新的具体产品类,而且还要提供与之对应的具体工厂类,系统中类的个数将成对增加,在一定程度上增加了系统的复杂度,有更多的类需要编译和运行,会给系统带来一些额外的开销。

2、 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。

适用场景

1、 客户端不知道它所需要的对象的类。在工厂方法模式中,客户端不需要知道具体产品类的类名,只需要知道所对应的工厂即可,具体的产品对象由具体工厂类创建,可将具体工厂类的类名存储在配置文件或数据库中。

2、抽象工厂类通过其子类来指定创建哪个对象。在工厂方法模式中,对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展。

转载于:https://www.cnblogs.com/Jabben_Yi/p/5516870.html

创建型模式之工厂方法模式相关推荐

  1. 23种设计模式之简单工厂模式,工厂方法模式,抽象工厂模式详解

    工厂模式详解 1. 简单工厂模式 1.1 需求分析 1.2 使用传统方式实现 1.2.1 类图 1.2.2 代码实现 1.2.2.1 新建pizza抽象类 1.2.2.2 希腊披萨实现类 1.2.2. ...

  2. 初识设计模式之简单工厂模式、工厂方法模式、抽象工厂模式

    简单工厂模式 工厂方法模式 抽象工厂模式 ​ 工厂顾名思义就是生产产品的意思,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式 ...

  3. 工厂模式——简单工厂模式、工厂方法模式和抽象工厂模式

    1.简述 工厂模式包括简单工厂模式.工厂方法模式和抽象工厂模式,属于创建型模式. 2.不使用工厂模式 (1)类图分析 一个接口Computer,接口有两个实现类HP和Apple,同时有一个测试类Cli ...

  4. 设计模式——工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

    声明: 本博客参考C语言中文网:C语言中文网连接 主要记录学习以下内容: 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 每个大要点都主要包括以下两部分内容: (1)基本概念和模型结构(包括一些 ...

  5. JAVA设计模式——工厂模式【简单工厂模式、工厂方法模式、抽象工厂模式】

    目录 简单工厂模式 传统方式 简单工厂模式 静态工厂模式 工厂方法模式 抽象工厂模式 工厂模式JDK-Calendar源码分析 工厂模式小结 简单工厂模式   看一个具体的需求 看一个披萨的项目:要便 ...

  6. 深入理解设计模式-简单工厂模式vs工厂方法模式vs抽象工厂模式对比讲解

    文章目录 前言 一.简单工厂模式 1.描述 2.特点 3.优缺点 4.类图说明 二.工厂方法模式 1.描述 2.特点 3.适用场景 4.类图说明 5.简单工厂模式与工厂方法模式区别: 三.抽象工厂模式 ...

  7. 工厂模式(简单工厂模式和工厂方法模式)详解

    简单工厂模式 (Simple Factory Pattern) 工厂方法模式 (Factory Method Pattern) 工厂模式: 工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪一 ...

  8. 设计模式之工厂类模式总结对比、简单工厂模式、工厂方法模式、抽象工厂模式、带反射的工厂模式、例子代码分析、最详细

    1. 题目 假设某公司同时用SqlServer.MySql数据库,即会切换两数据库(不同数据库的sql语句有些许差异),同时,两数据库里均有对Users.Departments表的操作(sql代码不一 ...

  9. 抽象工厂模式java_面试官:说一下静态工厂模式,工厂方法模式,抽象工厂的区别吧...

    静态工厂模式 用生活中的场景类比一下这三种模式,假如你想学习Java视频,你得自己到处去找资料,找资料是一个繁琐的过程,过一段时间你又想学Python视频了,你还得去找资料.现在你在学校上学,你想学J ...

最新文章

  1. 014——数组(十四)array_reduce array_slice array_splice array_sum
  2. 编译原理实验一预习报告
  3. Java接口的幂等性
  4. 不悲观-不emo-永远保持正能量——21年末,去掉所有的不开心
  5. React Native Weex 区别
  6. /dev/mtdN和/dev/mtdblockN的区别
  7. mysql show table column_mysql show columns 等show的用法
  8. java interface 默认_Java8 接口interface默认方法
  9. axi dma 寄存器配置_STM32 ADC多通道转换的DMA传输示例
  10. 【webpack】使用DllPlugin拆分模块
  11. C# dataGridView控件 获取整行宽度 整列高度 设置某列宽度 设置某行高度
  12. dsp31段最佳调音图_均衡器如何使用_31段均衡器调整方法
  13. 微服务测试:如何破解测试所面临的问题?测试的类型和范围你懂吗
  14. [转]我奋斗了18年不是为了和你一起喝咖啡
  15. 练习3-8 查询水果价格 (15 分)
  16. Java并发学习(四)-sun.misc.Unsafe
  17. Allegro建立非标准热风焊盘之 理解X IX IY 命令
  18. Xposed框架初次见面-开发自己的Xposed插件
  19. 智能AI短视频搬运剪辑小程序,可过原创检测
  20. 技能竞赛国赛_2020高教社杯全国大学生数学建模竞赛常见问题解答

热门文章

  1. 作为一个新手程序员该如何成长?
  2. 微信小程序把玩(三十四)Audio API
  3. 不同浏览器对回车提交表单的处理办法(转载)
  4. WDS部署服务之五高级功能
  5. Js中Reflect对象
  6. php数据库--mysql优化
  7. 海上瓶子下有东西吗_幼儿园小班健康教案《瓶子》含反思
  8. byobu_如何使用byobu多路SSH会话
  9. 视频分辨率和音频质量_高分辨率音频的声音是否比CD质量好?
  10. 僵尸肖恩黑胶唱片_建立一个非常适合黑胶唱片的DIY放大器套件