设计模式04-创建型模式1(简单工厂/工厂模式/抽象工厂/Java)

3.1 简单工厂模式

3.1.1 创建型模式

创建型设计模式将对象的创建过程和对象的使用过程分离,用户使用对象时无需关注对象的创建细节,外界对于这些对象只需要知道它们共同的接口,而不用清楚其实现细节,使得整个系统的设计更加符合单一职责原则。软件的结构也更为清晰。

3.1.2 简单工厂模式的定义

专门定义一个类来负责创建其他类的实例,可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

3.1.3 简单工厂模式的分析与实现
image-20241018173701097
  • 工厂角色:即工厂类,简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可被外部直接调用,创建所需的产品对象;工厂类中提供了静态的工厂方法(它返回一个抽象产品类Product,所有具体产品都是抽象产品的子类。

  • 工厂类中只有简单的逻辑判断代码。不关心具体的业务处理过程,满足“单一职责原则”。

  • 调用工厂类的工厂方法时,由于工厂方法时静态方法,使用很方便,可通过类名直接调用,只需要传入一个简单的参数即可。

3.1.4 简单工厂模式的案例

某电视机厂专为各知名电视机品牌代工生产各类电视机,当需要海尔牌电视机时只需要在调用该工厂的工厂方法时传入参数“Haier”,需要海信电视机时只需要传入参数“Hisense”,工厂可以根据传入的不同参数返回不同品牌的电视机。现使用简单工厂模式来模拟该电视机工厂的生产过程。

image-20241018174238661
  • 抽象产品类和具体产品类
public interface TV {public void play();
}public class HaierTV implements TV{@Overridepublic void play() {System.out.println("Haier电视正在播放");}
}public class HisenseTV implements TV{@Overridepublic void play() {System.out.println("hisense电视正在播放");}
}
  • 工厂类
public class TVFactory {public static TV getTVMethod(String flag) throws Exception {if ("Haier".equalsIgnoreCase(flag)) {return new HaierTV();} else if ("Hisense".equalsIgnoreCase(flag)) {return new HisenseTV();} else {throw new Exception("抱歉没有此类电视");}}
  • Main类
public class Main {public static void main(String[] args) {String tvName = XMLUtilTV.getTVName();try {TV tvMethod = TVFactory.getTVMethod(tvName);tvMethod.play();} catch (Exception e) {throw new RuntimeException(e);}}
}public class XMLUtilTV {public static String getTVName() {try {//创建文本对象DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse(new File("src/main/resources/TVBrand.xml"));//通过DOM获取文本元素NodeList brandName = document.getElementsByTagName("brandName");Node content = brandName.item(0).getFirstChild();return content.getNodeValue();} catch (Exception e) {throw new RuntimeException(e);}}
}<?xml version="1.0" encoding="ISO-8859-1"?>
<config><brandName>Hisense</brandName>
</config>
3.1.5 简单工厂模式的优缺点
优点缺点
1.实现了对象的创建和使用分离1.工厂类职责太重,不宜维护
2.无需知道类名,只需要知道参数2.系统扩展难度大,且工厂类为静态类不能进行扩展
3.1.6 简单工厂模式适用场景
  • 工厂类负责创建的对象比较少,由于创建对象比较少。
  • 客户端只知道传入工厂类的参数,对于如何创建对象不关心。

3.2 工厂模式

3.2.1 工厂模式的定义

动机:为了解决简单工厂模式不易扩展以及工厂类职责太重的为问题。

在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口, 而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定 究竟应该实例化哪一个具体产品类。

3.2.2 工厂模式的分析与实现
image-20241018180159172
  • 核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给其子类去完成

  • 可以允许系统在不修改工厂角色的情况下引进新产品,增加具体产品–>增加具体工厂,符合“开闭原则”。

3.2.3 工厂模式的案例

将原有的电视机工厂进行分割,为每种品牌的电视机提 供一个子工厂,海尔工厂专门负责生产海尔电视机,海 信工厂专门负责生产海信电视机,如果需要生产TCL电视 机或创维电视机,只需要对应增加一个新的TCL工厂或创 维工厂即可,原有的工厂无须做任何修改,使得整个系 统具有更加的灵活性和可扩展性。

image-20241018180604353
  • 产品类
public interface TV {public void play();
}
public class HaierTV implements TV{@Overridepublic void play() {System.out.println("Haier电视正在播放");}
}
public class HisenseTV implements TV{@Overridepublic void play() {System.out.println("Hisense电视正在播放");}
}
  • 工厂类
public interface TVFactory {public TV produceTV();
}
public class HaierTVFactory implements TVFactory{@Overridepublic TV produceTV() {System.out.println("海尔电视已经被制造");return new HaierTV();}
}
public class HisenseTVFactory implements TVFactory{@Overridepublic TV produceTV() {System.out.println("海信电视已被制造");return new HisenseTV();}
}
  • 调用(为了更好的满足开闭原则,这里使用Java的反射机制来代替new关键字)
public class XMLUtilTVFactory {public static Object getTVFactoryMethod() throws Exception{//获取文本对象DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(new File("src/main/resources/TVFactoryMethod.xml"));//获取文本内容NodeList nodeList = doc.getElementsByTagName("factoryName");Node firstChild = nodeList.item(0).getFirstChild();String nodeValue = firstChild.getNodeValue();//通过反射获取对象Class className = Class.forName(nodeValue);Object obj = className.newInstance();return obj;}
}public class Main {public static void main(String[] args) {try {HisenseTVFactory tvFactoryMethod = (HisenseTVFactory) XMLUtilTVFactory.getTVFactoryMethod();TV tv = tvFactoryMethod.produceTV();tv.play();} catch (Exception e) {throw new RuntimeException(e);}}
}xml:
<?xml version="1.0" encoding="UTF-8" ?>
<config><factoryName>com.tyut.factory_method.example2.HisenseTVFactory</factoryName>
</config>
3.2.4 工厂模式的优缺点
优点缺点
1.实现了对象的创建和使用分离,将对象的创建细节全部封装在工厂中1.系统中的类的个数成对出现,加重系统的负担
2.在系统中添加新产品,完全符合开闭原则
3.2.5 工厂模式的适用场景
  • 客户端不需要知道具体 产品类的类名,只需要知道所对应的工厂即可,具体产品对 象由具体工厂类创建
  • 抽象工厂类通过其子类来指定创建哪个对象

3.3 抽象工厂模式

3.3.1 抽象工厂模式的定义

动机:需要一个工厂,生产多个对象

产品等级结构:产品的继承结构(一个产品的不同表现形式:名词)

产品族:指由同一个工厂生产的,位于不同产品等级结构中的一组产品(形容词)

定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

3.3.2 抽象工厂模式的分析与实现
image-20241018182801135
  • 抽象工厂中定义了多个方法,每一个方法代表一个产品等级
  • 具体工厂即表示每一个产品族的工厂
3.3.3 抽象工厂的案例

一个电器工厂可以产生多种类型的电器,如海尔工厂可以生产海尔电视机、海尔空调等,TCL工厂可以生产TCL电视机、TCL空调等,相同品牌的电器构成一个产品族,而相同类型的电器构成了一个产品等级结构,现使用抽象工厂模式模拟该场景。

image-20241018183128890
  • 产品类
public interface TV {public void play();
}
public class HaierTV implements TV{@Overridepublic void play() {System.out.println("海尔电视正在播放");}
}
public class HisenseTV implements TV{@Overridepublic void play() {System.out.println("海信电视正在播放");}
}public interface Conditioner {public void work();
}
public class HaierConditioner implements Conditioner{@Overridepublic void work() {System.out.println("海尔空调正在工作");}
}
public class HisenseConditioner implements Conditioner{@Overridepublic void work() {System.out.println("海信空调正在工作");}
}
  • 工厂类
public interface BrandFactory {public TV creatTV();public Conditioner createConditioner();
}
public class HisenseFactory implements BrandFactory{@Overridepublic TV creatTV() {System.out.println("海信电视已被制作");return new HisenseTV();}@Overridepublic Conditioner createConditioner() {System.out.println("海信空调已被制作");return new HisenseConditioner();}
}
public class HaierFactory implements BrandFactory{@Overridepublic TV creatTV() {System.out.println("海尔电视已被制作");return new HaierTV();}@Overridepublic Conditioner createConditioner() {System.out.println("海尔空调已被制作");return new HaierConditioner();}
}
  • Main类
public class Main {public static void main(String[] args) {try {BrandFactory factory = (HisenseFactory) XMLUtilBrandFactory.getFactory();TV tv = factory.creatTV();tv.play();Conditioner conditioner = factory.createConditioner();conditioner.work();} catch (Exception e) {throw new RuntimeException(e);}}
}public class XMLUtilBrandFactory {public static Object getFactory() throws Exception{//获取XML文本DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.parse(new File("src/main/resources/BrandFactory.xml"));//获取工厂名字NodeList nodeList = doc.getElementsByTagName("brandFactory");Node firstChild = nodeList.item(0).getFirstChild();String className = firstChild.getNodeValue();//通过反射获取工厂对象Class<?> aClass = Class.forName(className);Object obj = aClass.newInstance();return obj;}
}
3.3.4 抽象工厂的优缺点
优点缺点
1.实现了对象的创建和使用分离。1.增加新的产品等级结构麻烦,违背了开闭原则
2.当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象
3.3.5从抽象工厂模式的适用场景
  • 系统中有多于一个的产品族,但每次只使用其中某一产品族
  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节

image-20241018184601239

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

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

相关文章

console.log(“res.data = “ + JSON.stringify(res.data));

res.data[object Object] 说明你在控制台打印 res.data 时&#xff0c;它是一个 JavaScript 对象&#xff0c;而不是字符串。这种情况下&#xff0c;console.log 输出的 [object Object] 表示它无法直接显示对象的内容。 要查看 res.data 的实际内容&#xff0c;你需要将其转换…

​​Spring6梳理17——基于XML的自动装配

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 ①引入 ②场景模拟 2.1 创建UserController类文件 2.2 创建UserService接口文件 2…

关于jmeter中没有jp@gc - response times over time

1、问题如下&#xff1a; jmeter没有我们要使用的插件 2、解决方法&#xff1a; 选择下面文件&#xff0c;点击应用&#xff1b; 3、问题解决 ps&#xff1a;谢谢观看&#xff01;&#xff01;&#xff01;

Java面向对象(三)(抽象和封装)(自己学习整理的资料)

一.类的提炼过程 从现实生活中归纳总结出&#xff0c;多种相同物种&#xff0c;具有的相同的特性&#xff08;属性&#xff0b;行为&#xff09;提炼到一个容器里&#xff0c;给这个容器起一个名字&#xff0c;名字就是类。 步骤&#xff1a; 发现类&#xff08;Dog&#xff…

亿佰特STM32MP13工业核心板【学习】

资料链接&#xff1a;ebyte.com/serchlist.aspx?keyECK10 加屏蔽罩的方法确实可以防EMC干扰防水防潮&#xff1a; 宽度: 16 位宽表示数据总线的宽度&#xff0c;意味着每次可以传输 16 位的数据。这在某些应用中可以提高内存带宽。电压: DDR3L SDRAM 的工作电压通常为 1.35V&…

32 类和对象 · 中

目录 一、类的默认成员函数 二、构造函数 &#xff08;一&#xff09;构造函数的特点 &#xff08;二&#xff09;使用例 1、Date类 2、Stack类 &#xff08;三&#xff09;总结 三、析构函数 &#xff08;一&#xff09;析构函数的特点 &#xff08;二&#xff09;使…

scrapy的xpath在控制台可以匹配,但是到了代码无法匹配(无法匹配tbody标签)

问题 使用xpath-helper可以匹配到,然后scrapy却无法 然后写入html来看看 发现根本就没有tbody,太可恶了 解决 方法1 不使用tbody就可以 方法2 使用或运算符 | big_list response.xpath("//div[classChannelClasssNavContent]/table/tbody/tr[1]/td/table/tbody/t…

Android OpenGL天空盒

在我们的项目学习过程中&#xff0c;我们从一片漆黑的虚空开始构建。为了给这个世界增添一些色彩&#xff0c;我们加入了三个粒子喷泉&#xff0c;但即便如此&#xff0c;我们的世界依然大部分被黑暗和虚无所笼罩。这些喷泉仿佛悬浮在无尽的黑暗之中&#xff0c;没有边界&#…

玫瑰花HTML源码

HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…

unity学习-全局光照(GI)

在全局光照&#xff08;Lighting&#xff09;界面有两个选项 Realtime Light&#xff08;实时光照&#xff09;&#xff1a;在项目中会提前计算好光照以及阴影的程序&#xff0c;当你需要调用实时全局光照的时候会将程序调用出来使用 Mixed Light&#xff08;烘焙光照&#x…

Nova-Admin:基于Vue3、Vite、TypeScript和NaiveUI的开源简洁灵活管理模板

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和工作学习方法 Nova Admin是一个基于Vue3、Vite、TypeScript和NaiveUI的简洁灵活的管理模板。这个项目旨在为开发者提供一个现代化、易于定制的后台管理界面解决方案。无…

什么是3D模型?如何进行3D建模?应用领域有哪些?

3D模型是在计算机图形学中&#xff0c;为某个表面或物体在专用软件中创建的数字形象&#xff0c;它代表了一个物理实体在三维空间中的形态。以下是对3D模型的详细解释及实现方式的介绍&#xff1a; 一、3D模型的定义 概念&#xff1a;3D模型&#xff0c;即三维模型&#xff0…

springboot+vue的宠物医院管理系统(源码+lunwen)

基于vuespringboot的宠物医院管理系统&#xff0c;分为前台页面和后台管理端。 前台页面&#xff1a; 用户注册与登录&#xff1a;用户可以创建账户并登录系统&#xff0c;以便预约服务、查看个人信息等。宠物信息管理&#xff1a;用户可以添加、编辑和删除自己的宠物信息&am…

数字后端实现静态时序分析STA Timing Signoff之min period violation

今天给大家分享一个在高性能数字IC后端实现timing signoff阶段经常遇到的min period violation。大部分时候出现memory min period问题基本上都是需要返工重新生成memory的。这是非常致命的错误&#xff0c;希望大家在做静态时序分析时一定要查看min period violation。 什么是…

RabbitMQ 发布确认模式

RabbitMQ 发布确认模式 一、原理 RabbitMQ 的发布确认模式&#xff08;Publisher Confirms&#xff09;是一种机制&#xff0c;用于确保消息在被 RabbitMQ 服务器成功接收后&#xff0c;发布者能够获得确认。这一机制在高可用性和可靠性场景下尤为重要&#xff0c;能够有效防止…

数据结构——顺序表的基本操作

前言 介绍 &#x1f343;数据结构专区&#xff1a;数据结构 参考 该部分知识参考于《数据结构&#xff08;C语言版 第2版&#xff09;》24~28页 补充 此处的顺序表创建是课本中采用了定义方法为SqList Q来创建&#xff0c;并没有使用顺序表指针的方法&#xff0c;具体两个…

TCL中环开工率下滑,员工集体要求解约赔偿

“ 尽管中环的市占率有所提高&#xff0c;但是高开工率也带来了巨量硅片库存&#xff0c;严重拖累了公司业绩。 ” 转载&#xff1a;科技新知 原创 作者丨依蔓 编辑丨蕨影 因大幅下调开工率&#xff0c;光伏硅片龙头TCL中环疑似遭遇员工“离职潮”&#xff1f; 近日&…

[云] 创建 Docker 镜像,将其推送到 Amazon Elastic Container Registry (ECR),并对已部署的应用程序进行负载测试

在此作业中&#xff0c;您将学习如何使用 AWS Lambda 和 API Gateway 将机器学习模型部署为无服务器应用程序。您将创建 Docker 镜像&#xff0c;将其推送到 Amazon Elastic Container Registry (ECR)&#xff0c;并对已部署的应用程序进行负载测试。此外&#xff0c;您还将分析…

【KEIL那些事 4】CMSIS缺失!!!!导致不能编译!!!!软件自带芯片下载缓慢!!!!!!快速下载芯片包!!!!!

安装了keli发现emmm&#xff0c;CMSIS缺失&#xff01;&#xff01;&#xff01;&#xff01;不能编译&#xff0c;&#xff0c;&#xff0c;自带下载芯片缓慢&#xff0c;&#xff0c;&#xff0c;官网下载emmm&#xff0c;竟然不带动的&#xff01;&#xff01;&#xff01;&…

数据库集群

主从复制 作用&#xff1a; 1.做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xff0c;可切换到从数据库继续工作&#xff0c;避免数据丢失。 2.架构的扩展。业务量越来越大&#xff0c;I/O访问频率过高&#xff0c;单机无法满足&#xff0c;此…