【从零开始学设计模式】第三章_工厂方法模式

第三章_工厂模式

1.介绍

1.1定义

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

1.2解决的问题

创建者和调用者的耦合,那么代码层面其实就是取消对new的使用。

1.3应用实例

需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现

1.4方法

创建工厂模式的方法有三种:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象方法模式

1.5角色

  • 抽象产品:定义了产品的共同接口或抽象类。它可以是具体产品类的父类或接口,规定了产品对象的共同方法。
  • 具体产品:实现了抽象产品接口,定义了具体产品的特定行为和属性。
  • 抽象工厂:声明了创建产品的抽象方法,可以是接口或抽象类。它可以有多个方法用于创建不同类型的产品。
  • 具体工厂:实现了抽象工厂接口,负责实际创建具体产品的对象。

2.举例

2.1简单工厂模式

2.1.1模式图

在这里插入图片描述

2.1.2代码举例

  • Phone接口
public interface Phone {void getBrand();
}
  • Meizu品牌类
public class Meizu implements Phone {@Overridepublic void getBrand() {System.out.println("魅族");}
}
  • Xiaomi品牌类
public class Xiaomi implements Phone {@Overridepublic void getBrand() {System.out.println("小米");}
}
  • PhoneFactory工厂类
public class PhoneFactory{public static Phone getPhone(String phone){if("小米".equals(phone)){return new Xiaomi();}else if ("魅族".equals(phone)){return new Meizu();}else {return null;}}
}
  • 消费者类
public class Customer {public static void main(String[] args) {PhoneFactory.getPhone("Xiaomi").getBrand();PhoneFactory.getPhone("Meizu").getBrand();}
}

2.1.3遇到的问题

随着手机品牌增多,工厂生产也需要对应的增加,工厂内部就需要不断的调整。
从代码层面——对内部代码的PhoneFactory工厂类需要增加(也就是需要修改内部代码:那么就会违反OOP原则—开闭原则:一个软件实体应当对扩展开放,对修改关闭。那怎么解决呢?

image-20240205105534859

2.2工厂方法模式

2.2.1模式图

image-20240205105534859

2.2.2代码

  • Phone接口
public interface Phone {void getBrand();
}
  • PhoneFactory接口
public interface PhoneFactory {Phone getPhone();
}
  • Xiaomi品牌类
public class Xiaomi implements Phone {@Overridepublic void getBrand() {System.out.println("小米");}
}
  • XiaomiFactory工厂类
public class XiaomiFactory implements PhoneFactory {@Overridepublic Phone getPhone() {return new Xiaomi();}
}
  • MeiZu品牌类
public class MeiZu implements Phone {@Overridepublic void getBrand() {System.out.println("魅族");}
}
  • MeiZuFactory工厂类
public class MeizuFactory implements PhoneFactory{@Overridepublic Phone getPhone() {return new Meizu();}
}
  • 消费者
public class Customer {public static void main(String[] args) {Phone xiaomi = new XiaomiFactory().getPhone();Phone meizu = new MeizuFactory().getPhone();xiaomi.getBrand();meizu.getBrand();}
}

2.2.3优缺点

工厂方法模式解决简单工厂模式是需要付出代价的!
看到上图工厂方法模式图里==新增用虚线画的Huawei品牌,每新增一个品牌就需要增加,对应新的工厂==,会发现需要花费很大的成本,现在才三个新的品牌,那么等到十个、一百个的时候就会变得更加的复杂和难以维护。

3.JDK 中的工厂模式

image-20240205105534859

4.优缺点

静态工厂模式:在实际去开发中会发现比较常用,尽管上面讲了不符合(面向对象)OOP原则。
工厂方法模式:不修改工厂类的前提,也就是说不修改已有类,实现对扩展是开发,对修改关闭。
抽象工厂模式,下次单独拿出来讲。

4.1工厂方法模式优点

(1)良好的封装性、代码结构清晰。

如一个调用者想创建一个对象,只需要知道其名称即可,降低了模板间的耦合。

(2)扩展性好。

如果想增加一个产品,只需扩展一个工厂类即可。

(3)屏蔽产品类

调用者只关心产品的接口。

(4)典型的解耦框架

4.2工厂方法模式缺点

每增加一个产品,就需要增加一个产品工厂的类,增加了系统的复杂度。

5.应用

5.1何时使用

不同条件下创建不同实例时。方法是让子类实现工厂接口。

5.2使用场景

(1)需要生成对象的地方

(2)需要灵活的、可扩展的框架。

(3)数据库访问、数据库可能变化时

5.3应用实例

(1) 需要一辆汽车,直接从工厂里面提货,不用去管这辆车是怎么做出来的。

(2)hibernate换数据库只需换方言和驱动即可。

(3)简单计算器的实现。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【vue3学习笔记】shallowReactive与shallowRef;readOnly与shallowReadOnly;toRaw与markRaw

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 课程 P158节 《shallowReactive与shallowRef》笔记: reactive()与shallowReactive():reactive()处理后的数据是响应式的,对象内嵌套的深层结构全部是响应式的。shallowReactive()处理后的数据…

【C语言期末】商品管理系统

本文资源:https://download.csdn.net/download/weixin_47040861/88820155 1.题目要求 商品管理系统 商品信息包括:包括编号、类别、名称、价格、折扣比例、生产时间 、存货数量等要求:1、信息首先保存在文件中,然后打开文件进行…

Linux操作系统基础(三):虚拟机与Linux系统安装

文章目录 虚拟机与Linux系统安装 一、系统的安装方式 二、虚拟机概念 三、虚拟机的安装 四、Linux系统安装 1、解压人工智能虚拟机 2、找到解压目录中的node1.vmx 3、启动操作系统 虚拟机与Linux系统安装 一、系统的安装方式 Linux操作系统也有两种安装方式&#xf…

以“防方视角”观社工钓鱼攻击

为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 案例概述02 攻击路径03 防方思路 01 案例概述 这篇文章来自奇安信攻防社区“小艾”,记录的某师傅通过社工钓鱼诱导企业员工点击含有木马的文件,侵入系统取得了终端控制权。接…

MyBatis之环境搭建以及实现增删改查

MyBatis之环境搭建以及实现增删改查 前言准备工作1.保证数据库已启动2. 创建Person表 MyBatis开发环境搭建1.下载MyBatis jar包2.下载MySQL的JDBC驱动3.新建Java工程(Java8),导入MyBatis的jar包以及JDBC驱动 实现步骤1. 创建Peron类2. 编写Ma…

c语言--指针数组(详解)

目录 一、什么是指针数组?二、指针数组模拟二维数组 一、什么是指针数组? 指针数组是指针还是数组? 我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。 那指针数组呢?是存放…

SpringCloud-Eureka原理分析

Eureka是Netflix开源的一款用于实现服务注册与发现的工具。在微服务架构中,服务的动态注册和发现是必不可少的组成部分,而Eureka正是为了解决这一问题而诞生的。 一、为何需要Eureka 在微服务架构中,服务之间的协同合作和高效通信是至关重要…

【性能最佳实践】跟着我们一起玩转查询模式与性能分析!

使用最新的驱动程序 MongoDB的官方驱动程序是由负责核心数据库开发的同一个专业团队打造的。这些驱动程序的更新通常比数据库本身更频繁,大概每几个月就会发布一次新版本。我们建议您尽可能使用最新版本的驱动程序,并在您使用的编程语言中安装可用的本地…

蓝桥杯Web应用开发-CSS3 新特性【练习三:文本阴影】

文本阴影 text-shadow 属性 给文本内容添加阴影的效果。 文本阴影的语法格式如下: text-shadow: x-offset y-offset blur color;• x-offset 是沿 x 轴方向的偏移距离,允许负值,必须参数。 • y-offset 是沿 y 轴方向的偏移距离&#xff0c…

OpenMLDB 作为中国唯一的特征平台产品入选 2023 Gartner 研究报告

在国际权威咨询与研究机构 Gartner 发布的重要研究报告《The Logical Feature Store: Data Management for Machine Learning》(《逻辑特征存储:机器学习的数据管理》,下文简称报告)中,OpenMLDB 荣幸作为中国唯一的特征平台代表产…

国产信创领跑者:暴雨信息的创新与实践

随着数字化转型的加速推进,信创产业作为数字经济发展的重要支柱,正日益受到社会各界的广泛关注。在这个大背景下,暴雨信息积极响应国家号召,全面适配国产化,推动信创产业的技术创新和应用拓展,成为了行业的…

Mybatis- plus 基本使用

目录 一. 引入依赖 二.定义Mapper 三.常见注解 3.1TableName 3.2.TableId 3.3TableField 3.4常见配置 一. 引入依赖 由于这个starter包含对mybatis的自动装配&#xff0c;因此完全可以替换掉Mybatis的starter。 <dependency><groupId>com.baomidou</gr…

前端JavaScript篇之数组的遍历方法有哪些?forEach和map方法有什么区别?

目录 数组的遍历方法有哪些&#xff1f;forEach和map方法有什么区别&#xff1f;forEach()map()filter()for…ofevery() 和 some()find() 和 findIndex()reduce() 和 reduceRight()forEach和map方法有什么区别总结 数组的遍历方法有哪些&#xff1f;forEach和map方法有什么区别…

U3D记录之FBX纹理丢失问题

今天费老大劲从blender建了个模型&#xff0c;然后导出进去unity 发现贴图丢失 上网查了一下 首先blender导出要改设置 这个path mode要copy 然后unity加载纹理也要改设置 这里这个模型的纹理load要改成external那个模式 然后就有了&#xff0c;另外这个导出还有好多选项可…

Spring如何扫描自定义的注解?

目录 一、Spring框架介绍 二、什么是自定义注解 三、如何扫描自定义的注解 一、Spring框架介绍 Spring框架是一个开源的Java应用程序框架&#xff0c;它提供了一种全面的编程和配置模型&#xff0c;用于构建现代化的企业级应用程序。Spring框架的核心原则是依赖注入&#x…

使用Softing edgeConnector模块将云轻松连接到Siemens PLC

一 工业边缘的连接解决方案 云服务提供商 (CSP) 引入了服务和功能&#xff0c;以简化基于云的工业物联网解决方案的实施。Azure Industrial IoT Platform或AWS IoT SiteWise支持标准协议和接口&#xff0c;例如OPC UA或MQTT。但是&#xff0c;如果您希望在典型的旧改项目中连接…

HttpServletResponse接口用于表示状态代码的字段

1. HttpServletResponse接口用于表示状态代码的字段 您已学习了状态代码以及可用于从servlet向客户机发送状态代码的HttpServletResponse接口的字段。下表列出了HttpServletResponse接口表示状态代码的一些其他字段。 字段状态代码描述SC_HTTP_VERSION_NOT_SUPPORTED505服务器…

Midjourney提示词风格调试测评

在Midjourney中提示词及风格参数的变化无疑会对最终的作品产生影响&#xff0c;那影响具体有多大&#xff1f;今天我我们将通过一个示例进行探究。 示例提示词&#xff1a; 计算机代码海洋中的黄色折纸船&#xff08;图像下方&#xff09;风格参考:金色长发的女人&#xff0c…

222. 完全二叉树的节点个数 - 力扣(LeetCode)

题目描述 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干…

20240207-不要用摸鱼打发时间

20240207-不要用摸鱼打发时间 今天是农历年倒数第三天&#xff0c;很多人都已经回家过年了。我有其他出行计划&#xff0c;所以今年没有回家。其实这一点也有违背自己每年都要回家的原则&#xff0c;但相比往年&#xff0c;真的是更愿意出去不愿意回家了。 想家吗&#xff0c;…