当前位置: 首页 > news >正文

工厂模式详情

一.介绍工厂模式的用途与特点

  • 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
  • 定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
    工厂模式是一种常用的设计模式,它用来封装对象的创建过程,以便在程序中随时根据需要生成对象的实例。在工厂模式中,我们将对象的创建过程封装在一个工厂类中,客户端无需关心对象的创建过程,只需要调用工厂类的方法即可获取到想要的对象。
    工厂模式常见的有三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。

二.简单工厂模式

在这里插入图片描述

使用后:
在这里插入图片描述

1. 基本介绍

简单工厂模式是最基本的工厂模式,它通过一个工厂类来创建不同类型的对象,而客户端只需要传递不同的参数给工厂类即可获得不同类型的对象实例。简单工厂模式有三个角色:工厂类、抽象产品类和具体产品类。其中,工厂类负责创建不同类型的对象,抽象产品类定义了产品的公共接口,具体产品类则实现了不同类型产品的具体生产过程。

2. 传统的方式的改进

例子:
比如我们这时要新增加一个Pizza的种类(Pepper披萨),我们需要做如下修改.
改进的思路分析 :
分析:修改代码可以接受,但是如果我们在其它的地方也有创建Pizza的代码,就意味着,也需要修改,而创建Pizza的代码,往往有多处。
思路:把创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改该类就可,其它有创建到Pizza对象的代码就不需要修改了。(简单工厂模式)

3. 项目应用-i18n国际演示

语言的切换

public class Software {public static void main(String[] args) {I18n i18n = I18NFactory.getI18NObject("china");System.out.println(i18n.getTitle());}
}
public interface I18n {public String getTitle();
public class I18NFactory {public static I18n getI18NObject(String area){if (area.equals("china")){return new Chinese();}else if (area.equals("spain")){return new Spainish();}else if (area.equals("italy")) {return new Italian();} else {return null;}}
}
public class Spainish implements I18n{public String getTitle(){return "Sistema de gestion del personal";}
}
public class Italian implements I18n{public String getTitle(){return "Sistema della direzione del personale";}
}
public class Chinese implements I18n{public String getTitle(){return "人事管理系统";}
}

好处:功能与功能之间更加明确,之间的耦合度降低

4. 简单工厂模式的优缺点

优点是实现了对象创建和使用的职责分离,c端不需要知道创建产品的具体过程,在不修改任何代码的情况下可以增加新的具体产品类
缺点是违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,就需要修改工厂类。在产品类型较多的情况下工厂逻辑会变复杂,不利于维护。

二.工厂方法模式

工厂方法模式是简单工厂模式的一种变形形式,它对简单工厂模式进行了更细粒度的划分,通过定义工厂接口和工厂实现类的方式,让每个工厂只生产一种产品,从而更好地满足开闭原则。工厂方法模式同样有三个角色:抽象工厂类、抽象产品类和具体产品类。在工厂方法模式中,每个具体产品类都对应一个具体的工厂类,客户端需要知道的是具体的工厂实现类,通过它来创建所需要的对象实例。
在这里插入图片描述

抽象工厂

public interface FactoryI18n {I18n create();
}
public class FactoryItalian implements FactoryI18n{@Overridepublic Italian create() {return new Italian();}
}
public class FactoryChinese implements FactoryI18n {@Overridepublic Chinese create() {return new Chinese();}
}

抽象产品

abstract class I18n {public I18n(){}
}public class Italian extends I18n{public Italian() {System.out.println("Sistema della direzione del personale");}
}public class Chinese extends I18n{public Chinese(){System.out.println("人事管理系统");}
}

客户端

public class Software{public static void main(String[] args) {FactoryChinese factoryChinese = new FactoryChinese();Chinese chinese = factoryChinese.create();FactoryItalian factoryItalian = new FactoryItalian();Italian software = factoryItalian.create();}
}

三.抽象工厂模式

抽象工厂模式是对工厂方法模式的一种扩展,它也是针对多个产品族的情况下设计的,它不仅需要提供产品的创建方法,还需要提供创建产品族的方法。在抽象工厂模式中,抽象工厂类定义了创建产品组的方法,而具体工厂类则负责生产产品组,每个产品组中包含多个产品,即每个工厂将生产多个产品,而每个产品又分别由不同的具体工厂进行实现。
在这里插入图片描述

在这里插入图片描述

//发动机型号
public interface Engine {
}
public class EngineA implements Engine {public EngineA(){System.out.println("制造-->EngineA");}
}
public class EngineB implements Engine {public EngineB(){System.out.println("制造-->EngineB");}
}//空调型号
public interface Aircondition {
}
public class AirconditionA implements Aircondition{public AirconditionA(){System.out.println("制造-->AirconditionA");}
}
public class AirconditionB implements Aircondition{public AirconditionB(){System.out.println("制造-->AirconditionA");}
}
//创建工厂接口
public interface AbstractFactory {//制造发动机public Engine createEngine();//制造空调public Aircondition createAircondition();
}public class FactoryBMW320 implements AbstractFactory{@Overridepublic Engine createEngine() {return new EngineA();}@Overridepublic Aircondition createAircondition() {return new AirconditionA();}
}public class FactoryBMW523 implements AbstractFactory {@Overridepublic Engine createEngine() {return new EngineB();}@Overridepublic Aircondition createAircondition() {return new AirconditionB();}
}
public class Custormer {public static void main(String[] args) {//生产报名320系列配件FactoryBMW320 factoryBMW320 = new FactoryBMW320();factoryBMW320.createEngine();factoryBMW320.createAircondition();//生成宝马523系列配件FactoryBMW523 factoryBMW523 = new FactoryBMW523();factoryBMW523.createEngine();factoryBMW523.createAircondition();}
}

四.工厂模式小结

  1. 工厂模式的意义
    将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
  2. 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
  3. 设计模式的依赖抽象原则
  4. 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
  5. 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
  6. 不要覆盖基类中已经实现的方法

相关文章:

工厂模式详情

一.介绍工厂模式的用途与特点 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例…...

【Word】调整列表符号与后续文本的间距

1. 默认的列表格式: 2. 修改间距: ************************************************** 分割线 ************************************************************ 3. 效果...

匠心独运,B 端系统 UI 演绎华章之美

匠心独运,B 端系统 UI 演绎华章之美...

Java电商平台-开放API接口签名验证(小程序/APP)

说明:在实际的生鲜业务中,不可避免的需要对外提供api接口给外部进行调用. 这里就有一个接口安全的问题需要沟通了。下面是干货: 接口安全问题 请求身份是否合法? 请求参数是否被篡改? 请求是否唯一? AccessKey&am…...

Tale全局函数对象base

目录 1、 Tale全局函数对象base 1.1、 * tale alert删除 1.2、 * 成功弹框 1.3、 * 弹出成功,并在500毫秒后刷新页面 1.4、 * 警告弹框 1.5、 * 询问确认弹框,这里会传入then函数进来...

【启程Golang之旅】掌握Go语言数组基础概念与实际应用

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...

COMSOL中液晶材料光学特性模拟

前面我们根据FDTD官方文档设置了液晶指向的模型。COMSOL也可以根据相似的方法设置各项异性的周期性变化的材料。 该方法参考了luneburg_lens的COMSOL文档 在给出的文件中,可以发现定义-变量中可以使用默认坐标作为变量,即xyz。因此,折射率也可…...

虚拟现实环境下的远程教育和智能评估系统(五)

查阅相关VR眼动注意力联合教育学相关论文 1.Exploring Eye Gaze Visualization Techniques for Identifying Distracted Students in Educational VR(IEEE VR 2020) 摘要:我们提出了一种架构,使VR教学代理能够响应眼动追踪监控…...

【算法】模拟算法——Z字形变换(medium)

题解:模拟算法——Z字形变换(medium) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接:LINK 2.题解 利用模拟,来解决问题。 首先创建出一个O(numRows*n)的数组来,并按照题目要求把每个字符按顺序填进去。 这里以numRows…...

上位机图像处理和嵌入式模块部署(f103 mcu获取唯一id)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 对于stm32f103系列mcu来说,一般每一颗原厂的mcu,都会对应一个唯一的id。那这个id可以用来做什么用呢?个人认为&…...

运筹学_3.运输问题(特殊的线性规划)

目录 前言3.1 平衡运输问题中初始基可行解确定运输问题平衡运输与非平衡运输平衡运输问题的数学模型单纯形法解决平衡运输问题,初始可行基的确认 3.2 平衡运输问题的最优解判别求检验数表上作业法 3.3 产销不平衡的运输问题运输问题中产大于销的问题运输问题中产小于…...

科研项目书写作学习(持续更新中...)

写好一个科研项目书也是科研中很重要的一部分,所以借这篇博客做一个积累。还是以模块化的方式吧,后面慢慢那再整合逻辑。可能写的也不是很好,慢慢提升吧~ 背景 科研项目书的背景怎么写?首先要突出问题的价值(也就是做此研究的动…...

男士内裤哪个品牌好一点?2024热门男士内裤推荐

男人的内裤保质期只取决于被别人看见的次数,如果某条内裤从未被别人看见过,那它永远都是你的新内裤。也就是说,只要穿着破内裤这尴尬的瞬间没被目击,男人就能永远和一条内裤在一起。 实际上如果长时间不更换男士内裤,…...

Llama模型家族之RLAIF 基于 AI 反馈的强化学习(六) RLAIF 代码实战

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 LangGraph 在windows本地部署大模型 (三) 基于 LlaMA…...

计算机tcp/ip网络通信过程

目录 (1)同一网段两台计算机通信过程 (2)不同网段的两台计算机通信过程 (3)目的主机收到数据包后的解包过程 (1)同一网段两台计算机通信过程 如果两台计算机在同一个局域网中的同…...

42.开发中对String.format()的使用之空位补齐

用于空位补齐 Int x1; //对于传入的数字做处理,如果传入的数字不足三位,则使用数字0自动补齐 String numString.format(“%”3”d”,x); System.out.println(“num”num);//输出结果为:001 也可以简写成: String num2String…...

通用代码生成器应用场景四,跨编程语言翻译

通用代码生成器应用场景四,跨编程语言翻译 如果您有一个Java工程,想把它移植到Rust或Golang语言中去,希望尽可能加快研发速度。 如果您的系统是通用代码生成器开发的,保留了系统的SGS源文件或者SGS2的Excel模板,您可…...

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势

β-烟酰胺单核苷酸(NMN)功能不断得到验证 市场规模呈增长态势 β-烟酰胺单核苷酸(β-Nicotinamide mononucleotide,NMN)是一种生物活性分子,是一种辅酶Ⅰ(NAD)的前体,也是…...

深入理解 Go 语言中的字符串不可变性与底层实现

文章目录 前言1 字符串类型的数据结构组成2 为什么要这么设计数据结构?3 为什么说字符串类型不可修改?4 如何实现字符串的修改?5 为什么字符串修改的字面量用单引号?6 如何判断字符串的修改新建了一个字符串?7 字符串的…...

采购订单审批和取消例子

文章目录 1 Introduction2 Example 1 Introduction This is a exmaple for releaseing po and reseting po. 2 Example DATA:lw_in TYPE zmms015,lw_out TYPE zmms015_out,lt_head LIKE TABLE OF ZMMT003_head,lw_head TYPE ZMMT003_head,lt_item TYPE zmmt003_item_t,lt…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

MMaDA: Multimodal Large Diffusion Language Models

CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...