一、工厂方法模式概述

在工厂方法模式中不再提供一个统一的工厂类来创建所有的产品对象,而是针对不同的产品提供不同的工厂,系统提供一个与产品等级结构对应的工厂等级结构。

工厂方法模式:定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到子类。

举个栗子:
不同品牌的手机应该由不同的公司制造,华为公司生产华为手机,苹果公司生产苹果手机。

二、工厂方法模式结构与实现

2.1 工厂方法模式结构

工厂方法模式包含以下4个角色:
1,Product(抽象产品):它是定义产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的父类。

2,ConcreteProduct(具体产品):它实现了抽象产品接口,某种类型的具体产品由专门的具体工厂创建,具体工厂和具体产品之间一一对应。

3,Factroy(抽象工厂):在抽象工厂类中声明了工厂方法(Factory method),用于返回一个产品。抽象工厂是工厂方法模式的核心,所有创建对象的工厂类都必须实现该接口。

4,ConcreteFactory(具体工厂):它是抽象工厂类的子类,实现了在抽象工厂中声明的工厂方法,并可由客户端调用,返回一个具体产品类的实例。

2.2 工厂方法模式实现

与简单工厂模式相比,工厂方法模式最重要的特定是引入了抽象工厂角色,抽象工厂可以是接口,也可以是抽象类或者具体类

示例代码:

抽象产品代码示例:

//图片,充当抽象产品角色
public interface Image {public void read();}

具体产品代码示例:

//Gif图片,充当具体产品角色
public class GifImage implements Image{@Overridepublic void read() {System.out.println("读取Gif格式的图片");}
}//Jpg图片,充当具体产品角色
public class JpgImage implements Image{@Overridepublic void read() {System.out.println("读取Jpg格式的图片");}
}

抽象工厂代码示例:

//充当抽象工厂角色
public interface ImageReader {Image createImage();}

具体工厂代码示例:

//充当具体工厂角色
public class GifImageReader implements ImageReader{@Overridepublic Image createImage() {Image image = new GifImage();return image;}
}//充当具体工厂角色
public class JpgImageReader implements ImageReader{@Overridepublic Image createImage() {Image image = new JpgImage();return image;}
}

客户端代码示例:

public class Client {public static void main(String[] args) {/*** 案例需求描述:* 使用工厂方法模式,设计一个程序用来读取各种不同类型的图片格式,* 针对每一个种图片格式都设计一个图片读取器(ImageReader),* 例如GIF图片读取器(GifReader)用于读取GIF格式的图片,* JPG图片读取器(JpgReader)用于读取JPG格式的图片。* 请考虑系统的灵活性和可扩展性。*/ImageReader imageReader;Image image;imageReader = (ImageReader)XMLUtil.getBean();image = imageReader.createImage();image.read();/*** 这样,就只需要修改配置文件factorymethodconfig.xml的内容,不需要修改客户端,也不用修改产品和工厂的代码。* 符合开闭原则。*/}}public class XMLUtil {//该方法用于从XML配置文件提取具体类的类名,并返回一个实例对象public static Object getBean() {try {DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();DocumentBuilder documentBuilder = dFactory.newDocumentBuilder();Document document = documentBuilder.parse("src/resources/factorymethodconfig.xml");NodeList nodeList = document.getElementsByTagName("className");Node firstChild = nodeList.item(0).getFirstChild();String cName = firstChild.getNodeValue();Class<?> c = Class.forName(cName);Object obj = c.newInstance();return obj;} catch (Exception e) {e.printStackTrace();return null;}}
}//xml文件
<?xml version="1.0" encoding="UTF-16" ?><config><className>creationalpatterns.factorymethodpattern.JpgImageReader</className>
</config>

三、工厂方法的隐藏

有时候,为了进一步简化客户端的使用,还可以对客户端隐藏工厂方法,此时在工厂类中直接调用产品类的业务方法,客户端无需调用工厂方法创建产品对象,直接食用工厂对象即可调用所创建的产品对象中的业务方法。

修改抽象工厂类的代码:

//充当抽象工厂角色
public interface ImageReader {Image createImage();//java8版本支持接口写实现方法default void read() {this.createImage().read();}}

修改客户端代码:

public class Client {public static void main(String[] args) {ImageReader imageReader;Image image;imageReader = (ImageReader)XMLUtil.getBean();imageReader.read();}
}

四、工厂方法模式优缺点与适用环境

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

4.1 工厂方法模式的优点

  1. 提供了专门的工厂方法用来创建客户所需要的产品,同时向客户隐藏了哪种具体产品类被实例化这一细节。
  2. 它能够让工厂自主确认创建何种产品对象,而如何创建这个对象的细节完全封装在具体工厂内部。
  3. 在系统中加入新产品时,只需要加添加一个具体工厂和具体产品,其他类代码无需修改,完全符合开闭原则。

4.2 工厂方法模式的缺点

  1. 系统中类的个数成对增加,在一定程度上增加了系统的复杂度,会给系统带来一些额外的开销。
  2. 增加了系统的抽象性和理解难度。

4.3 工厂方法模式的适用环境

  1. 客户端不知道它所需要的对象的类。
  2. 抽象工厂通过其子类来指定创建哪个对象。

【参考文献】:
本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。

【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git

【设计模式】第4章·工厂方法模式相关推荐

  1. 北风设计模式课程---2、工厂方法模式

    北风设计模式课程---2.工厂方法模式 一.总结 一句话总结: 工厂方法模式相对于简单工厂模式只是修改了 [工厂核心类-将它变成接口],具体的创建产品的工作交给[工厂核心类的子类] 满足了开闭原则:不 ...

  2. 对设计模式的总结之工厂方法模式和抽象工厂模式

    前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...

  3. 第二部分:二十三种设计模式解读——什么是工厂方法模式

    二十三种设计模式解读--什么是工厂方法模式 author:陈镇坤27 日期:2022年2月10日 修改日期:2022年6月23日 文章目录 二十三种设计模式解读--什么是工厂方法模式 一.工厂方法模式 ...

  4. Java设计模式【之】工厂方法模式【场景:制作咖啡】

    Java设计模式[之]工厂方法模式[场景:制作咖啡] 1.工厂方法 1.1.工厂方法模式 1.2.具体需求(生产多种咖啡) 2.代码实现 2.1.代码结构 2.2.咖啡抽象类 2.3.一种咖啡 2.4 ...

  5. 跟着学设计模式 (1)— 工厂方法模式

    跟着学设计模式 (1)- 工厂方法模式 前提 工厂方法模式介绍 实现模拟发奖多种商品为例 代码实现 工厂模式优化代码 前提 好看的代码千篇一律,恶心的程序升职加薪. 谁发明了设计模式? 设计模式的概念 ...

  6. 《大话设计模式》读书笔记-第8章 工厂方法模式

    1.工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 2.工厂方法(Factory Method)结构图 3.工厂 ...

  7. 设计模式(2)工厂方法模式(Factory Method)

    设计模式(0)简单工厂模式 设计模式(1)单例模式(Singleton) 源码地址 0 工厂方法模式简介 0.0 工厂方法模式定义 工厂方法模式是在简单工厂模式基础上,为解决更复杂的对象创建问题而衍生 ...

  8. Java设计模式(一) -- 工厂方法模式

    java的设计模式大体上分为三大类: •创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式. •结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组 ...

  9. Java的二十三种设计模式(单例模式、工厂方法模式、抽象工厂模式)

    从这一块开始,我们详细介绍Java中23种设计模式的概念,应用场景等情况,并结合他们的特点及设计模式的原则进行分析. 创建型模式(5种):用于描述"怎样创建对象",它的主要特点是& ...

最新文章

  1. 《需求设计:构建用户想要和需要的产品》——3.7 品质
  2. 非计算机专业的学生,从事编程工作的上升壁垒是什么?
  3. linux 程序收到sigsegv信号_信号
  4. Windows Tips--How do I disable the Windows Firewall service?
  5. asp实现批量录入数据
  6. python ffmpy3与FFmpeg的安装
  7. mysql建立索引 有什么缺陷_MySQL数据库建立索引的优缺点以及什么样的字段适合建立索引...
  8. CSS基础必备知识点01
  9. iphonexr电池容量_初代手机到iPhone 12,从电池容量变化看充电功率的发展
  10. PHP表格整个往右,css - 使用table表格无端的整体向右偏移一段距离
  11. mysql user表字段详解_Mysql User表权限字段说明全介绍
  12. 求两个有序单链表的并交集
  13. 【车型识别】基于小波和盒维数实现车型识别含Matlab源码
  14. mysql-front服务器_mysql-front远程连接自己linux服务器上的mysql服务器
  15. 2021美国大学生数学建模竞赛D题
  16. C语言分支/顺序作业总结
  17. 【人脸识别】基于 Gabor+SVM和PCA+SVM实现人脸识别matlab源码含 GUI
  18. maya blend shape
  19. 通过两个小例子,更快了解-Xms -Xmx
  20. Makefile原理

热门文章

  1. 骁龙 730 正式发布:这回高通不挤牙膏了,还为游戏玩家带来大福利
  2. 想要邮件撤回,邮箱登录入口用哪个呢?
  3. php部署项目到服务器报错SQLSTATE[HY000] [2002] Connection timed out解决方法(纯学习笔记,不作为教程)
  4. ctfshow 群友挑战 CTFshow福利抽奖
  5. 基于 SpringBoot2 + Redis + Vue 商城管理系统,拼团、砍价、秒杀等都有,支持二次开发!...
  6. C# 学习笔记之委托、lambda表达式
  7. 小爱音箱mini无法响应的解决方法
  8. MYSQL/MSSQL/ORACLE数据库脚本代码
  9. 大数乘法(带小数点)
  10. 如何提取pdf文件中的某一页?