【设计模式】创建者模式之 工厂方法 抽象工厂

工厂方法模式(Factory Method)

一个特定功能,往往有多种实现方式,但是很难有某一个实现可以适用于所有情况,因此往往需要根据特定的场景选择不同的实现。试想:把选择具体实现的代码放在业务中会发生什么?每当我们需要一个新的功能拓展时,就要改动业务代码,但是这样违背了OCP,引入工厂方法模式可以解决这样的问题。

意图(Intent)

工厂方法模式:一种创建者模式,提供了一个创建类的接口,具体创建该类的哪种实现类,由传入的子类工厂决定

工厂方法模式其实就是对子类构造的封装。

工厂是对创建类的接口一种隐喻。我们把需求传递给工厂,工厂就能构造出一个相对应的子类

可以直接在工厂中加入产品的方法,这样就可以直接通过工厂使用产品方法,而不需要再调用产品

结构(Structure)

工厂方法模式的结构图如下:

在这里插入图片描述

  • CreatorProductProduct的工厂,它包含了一个构造Product的方法和Product内部的方法
  • ConcreProductAConcreProductBProduct的实现类,每个类都有一个对应的工厂子类
  • 工厂接口只负责定义工厂的行为,工厂的具体行为,由对应实现类的子类负责实现

为什么需要工厂方法模式?

工厂方法模式的必要性可以从多个维度解释,本文提供了其中两种解释:

  1. 首先我们要明确一个概念,客户端只通过接口使用产品,而不需要知道其中的细节,我们作为开发者也不想让客户端知道这些细节。工厂方法模式就可以理解为一种创建产品的接口,这个产品内部可能需要各种各样的属性,来实现产品的功能,客户端传入的数据怎么分配在该产品的属性中不是客户端需要知道的。

  2. 而从OCP的角度来看,如果没有工厂接口,每次新增加一个产品类,我们就要重新在客户端加入一段代码,实现该产品的创建,这个显然违背了OCP。

实现方式(implement)

  1. 为要实现的功能创建一个接口或者抽象类
  2. 为这个接口或抽象类创建一个工厂接口
  3. 用不同的子类实现这个接口或抽象类
  4. 为每个子类编写工厂接口的实现工厂类
  5. 在创建子类实例时,调用对应的工厂类的方法即可

优缺点(Pros & Cons)

  • 可以避免客户端和具体产品的高耦合

  • 保证SRP,选择并创建具体产品的工作交给工厂

  • 保证OCP,当有新的实现类的时候,只需要继承父类即可,不用改变客户端代码

  • 代码过于复杂,并且可能造成类爆炸

抽象工厂(Abstract Factory)

工厂方法模式为我们提供了每种产品的实现方法,解耦了客户端和具体产品的紧密关联,但是过于冗杂的类会让我们对项目管理的难度大大提升,为了解决这个问题,我们可以使用抽象工厂模式。

意图(Intent)

抽象工厂是对不同产品的抽象。就像我们可以通过学生的共有特性抽象出学生类一样,抽象工厂将具有某种相同特性的产品抽象到了一个类,这个类中有多个工厂方法。

工厂方法不是一个类!上文似乎把工厂方法作为一个类在讲解,这其实是为了简化工厂方法模式的讲解,而只在类中声明了工厂方法一个方法。

举个例子来讲,一套衣服包括了上衣和裤子。那么一个抽象工厂中就包含了两个工厂方法,一个用于生产上衣,一个用于生产裤子。

结构(Structure)

抽象工厂的结构图如下:

在这里插入图片描述

  • 抽象工厂负责建造两种产品:ProductAProductB
  • 定义一个抽象工厂的接口
  • 根据产品的不同风格实现抽象工厂接口

为什么需要抽象工厂模式?

抽象工厂模式是对工厂方法模式的一种拓展,一个抽象工厂类应该包含多种工厂方法,这样可以让类的管理更有逻辑性,也能对相似风格的不同产品进行抽象。

优缺点(Pros & Cons)

  • 具有工厂方法的优点

  • 可以保证来自同一工厂的不同产品是兼容的

  • 可以减少工厂方法带来的类爆炸

  • 使类的管理更清晰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/7077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的ThreadLocal为什么使用弱引用

ThreadLocal中为什么使用弱引用 补个概念: ThreadLocalMap中的key就是Entry,Entry是一个弱引用,关联了当前ThreadLocal对象。需要存储的数据为值。调用set方法要传入两个参数ThreadLocal对象和要存入ThreadLocal对象的数据。 如下图&#xf…

《第一行代码》第二版学习笔记(9)——服务

文章目录 一、线程二、解决异步消息处理机制1、消息组成2、AsyncTask 三、Service1、启动和停止服务2、活动和服务通信3、服务的生命周期4、创建前台服务5、使用IntentService 四、服务的最佳实践 一、线程 android不允许在子线程中更新IU操作 二、解决异步消息处理机制 1、…

41.乐理基础-拍号-小节、小节线、终止线

小节线:下图红框中的竖线就是小节线 小节、终止线:最后的终止线就是文字意思表示乐谱结束了,后面没有了 下图中 0.5表示0.5拍(八分音符)、1表示1拍(四分音符)、0.25表示0.25拍(十六分…

编程基础学什么课程内容

编程基础学习的课程内容有:程序设计基础、算法与数据结构、计算机科学原理、面向对象编程、网页开发基础等课程内容,以下是上大学网 (www.sdaxue.com)整理的具体课程或技能领域内容,供大家参考! 程序设计基础(或计算机…

每日OJ题_DFS解决FloodFill⑦_力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围)

目录 力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围) 解析代码 力扣LCR 130. 衣橱整理(原剑指Offer13机器人的运动范围) LCR 130. 衣橱整理 难度 中等 家居整理师将待整理衣橱划分为 m x n 的二维矩阵 grid&#xff…

【精品毕设推荐】基于Javaee的影视创作论坛的设计与实现

点击下载原文及代码 摘 要 随着时代的发展,互联网的出现,给传统影视行业带来的最大便利就是,方便了影视从业人员以及爱好者的交流和互动,而为用户提供一个书写影评,阅读影评以及回复影评的平台,以影评为…

《第一行代码》第二版学习笔记(8)——网络技术

文章目录 一、Http1、HttpURLConnection2、OKHttp 二、解析JSON格式数据1、使用JSONObject2、使用GSON解析JSON数据 一、Http 1、HttpURLConnection public void run() {HttpURLConnection connection null;BufferedReader reader null;try {URL url new URL("http://…

力扣每日一题114:二叉树展开为链表

题目 中等 提示 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

2024年CMS市场的份额趋势和使用统计

目前市面上有超过一半的网站都是使用CMS来搭建的,据不完全统计,现在大概有900多种CDM可供选择,以下是最常见的CMS的市场份额和使用率信息: 除了WordPress以外,Shopify和Wix也是比较流行的内容管理系统,尤其…

239 基于matlab的EKF(扩展卡尔曼滤波)_UKF(无迹卡尔曼滤波)_PF(粒子滤波)三种算法的估计结果比较

基于matlab的EKF(扩展卡尔曼滤波)_UKF(无迹卡尔曼滤波)_PF(粒子滤波)三种算法的估计结果比较,输出估计误差,并单独对粒子滤波进行估计及其置信区间可视化。程序已调通,可直接运行。 239 EKF(扩展卡尔曼滤波) - 小红书 …

一、Redis五种常用数据类型

Redis优势: 1、性能高—基于内存实现数据的存储 2、丰富的数据类型 5种常用,3种高级 3、原子—redis的所有单个操作都是原子性,即要么成功,要么失败。其多个操作也支持采用事务的方式实现原子性。 Redis特点: 1、支持…

【Linux】操作系统

上一篇博客我们从硬件的角度谈了计算机,我们说到了计算机的效率跟操作系统写的好不好有着直接的关系,那么这篇博客我们从软件的角度,就来谈一谈究竟什么是操作系统,为什么要有操作系统? 首先我们来大体的认识一下操作…

某塑料科技公司网络与机房监控运维项目

某塑料科技公司是由日本知名株式会社在中国投资的,以从事橡胶和塑料制品业为主的生产制造企业。随着企业信息化建设提速,信息化运用程度不断提高,对网络基础设施的管理也提出了更高要求,因此公司急需上线一款综合运维平台加强对整…

Go 语言 ORM 框架之 xorm

1、xorm 1.1、xorm 简介 xorm 是一个简单而强大的Go语言ORM库. 通过它可以使数据库操作非常简便。 特性 支持 struct 和数据库表之间的灵活映射,并支持自动同步事务支持同时支持原始SQL语句和ORM操作的混合执行使用连写来简化调用支持使用ID, In, Where, Limit,…

Linux—-vim基础使用

1、基本概念 Vim的工作模式有四种,普通模式,输入模式,命令模式,可视模式。 在终端中打开vim,只需要输入vim 文件,在普通模式下按i就会进入到输入模式,按下:进入命令模式,输入:q就可…

【前端学习——防抖和节流+案例】

定义 【前端八股文】节流和防抖 防抖 连续触发事件但是在设定的一段时间内只执行最后一次 代码实现思路【定时器】 大概意思就是: 每次按起键盘后,都将之前的定时器删除,重新开始计时。 节流 连续触发事件,只执行一次 …

Python从0到100(二十):文件读写和文件操作

一、文件的打开和关闭 有了文件系统可以非常方便的通过文件来读写数据;在Python中要实现文件操作是非常简单的。我们可以使用Python内置的open函数来打开文件,在使用open函数时,我们可以通过函数的参数指定文件名、操作模式和字符编码等信息…

某站戴师兄——Excel实战

1、设置下拉选项:数据——数据验证——设置 如下设置: 2、If、sumif、index、match综合应用: sumif(条件区域,条件,目标区域) sumifs(目标区域,条件区域1,条件1,条件区域2,条件2) …

Telnet的三种配置和SSH配置

Telnet的三种配置 实验配置思路: 配置接口IP地址: R1——配置接口IP地址 R2——配置接口IP地址 认证模式为none的配置 R1——认证模式配置为none R2——测试Telnet连接R1设备 认证模式为passwrd的配置 R1——认证模式配置为password R2——测试Telnet连…