设计模式之~工厂系列(简单工厂、工厂方法、抽象工厂)

news2024/11/19 21:25:00

目录

简单工厂模式

工厂方法模式

简单工厂 VS 工厂方法

抽象工厂模式:

拓展:

利用简单工厂模式优化抽象工厂  

利用反射+抽象工厂   进行优化

反射+配置文件+抽象工厂进行优化


简单工厂模式

优点:简单工厂模式的最大优点在于工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类。对与客户端来说去除了与具体产品的依赖。

缺点:违背开发-封闭原则(每增加一个功能类,都要在工厂方法里加逻辑判断)

适用场景:简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心。

结构图:

实例:(简单工厂和功能类:依赖关系)

工厂方法模式

  • 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

  • 在工厂方法模式中用户只需要关心所需产品对应的工厂,无须关心创建细节,而且加入新的产品符合开闭原则。

优点:

  • 工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。

  • 封装了对象的创建,使得要更换对象时,不需要做大的改动就可实现,降低了客户程序与产品对象的耦合。

  • 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

缺点:

  • 类的个数容易过多,增加复杂度。(需要有多个具体工厂)

  • 增加了系统的抽象性和理解难度

适用场景:

  • 当客户程序不需要知道要使用对象的创建过程。

  • 客户程序使用的对象存在变动的可能,或者根本就不知道使用哪一个具体的对象。

结构图:

实例:

简单工厂 VS 工厂方法

  • 工厂方法模式实现时,客户端需要决定实例化哪一个工厂类(子类),选择判断的问题还是存在的。也就是说工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来进行。你想要增加功能,本来是修改工厂类的,而现在是修改客户端。

  • 都集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合。

抽象工厂模式:

        抽象工厂模式为创建一组对象提供了一种解决方案。 与工厂方法模式相比, 抽象工厂模式中的具体工厂不只是创建一种具体对象,它负责创建一组(族)具体对象。

优点:

  • 抽象工厂模式隔离了具体类的生成, 使得客户并不需要知道什么被创建。 由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口, 因此只需改变具体工厂的实例, 就可以在某种程度上改变整个软件系统的行为。

  • 当一个族中的多个对象被设计成一起工作时, 它能够保证客户端始终只使用同一个族中的对象。

  • 增加新的族很方便, 无须修改已有系统, 符合“开闭原则”。

缺点:

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂 的接口

  • 增加了系统的抽象性和理解难度。

适用场景:

系统中有多个产品族,而系统一次只可能消费其中一族产品。而这一族产品中每种产品又需要具有不同的创建方法

结构图:

实例:

拓展:

利用简单工厂模式优化抽象工厂  

package 抽象工厂模式;

public class DataAccess {
	private static String db="Sqlserver";
	
	public static IUser CreateUser() {
		IUser result =null;
		switch(db){
		case"Sqlserver":
			result=new SqlserverUser();
			break;
		case"Access":
			result=new AccessUser();
			break;
		}
		return result;
	}
	public static IDepartment CreateDepartment() {
		IDepartment result =null;
		switch(db){
		case"Sqlserver":
			result=new SqlserverDepartment();
			break;
		case"Access":
			result=new AccessDepartment();
			break;
		}
		return result;
	}
}

利用反射+抽象工厂   进行优化

package 抽象工厂模式;
//不在再使用switch-case语句
public class DataAccess1 {
	private static String AssemblyName="抽象工厂模式";
	private static String db="Sqlserver";
	
	public static IUser CreateUser() throws InstantiationException, IllegalAccessException, ClassNotFoundException{
		String className=AssemblyName+"."+db+"User";
		return (IUser)Class.forName(className).newInstance();
	}
	public static IDepartment CreateDepartment() throws InstantiationException, IllegalAccessException, ClassNotFoundException{
		String className=AssemblyName+"."+db+"Department";
		return (IDepartment)Class.forName(className).newInstance();
	}
}

反射+配置文件+抽象工厂进行优化

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

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

相关文章

Arthas-JVM相关命令使用

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。 开头: 我们先说下生产使用频率较高的有哪些:dashboard、heapdump、jvm…

【mqtt】MQTT安装与入门案例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍MQTT的c版本入门。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习知识,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&…

java高频面试题

集合 前言 时间复杂度 时间复杂度是用来来评估代码的执行耗时的,大O表示法:不具体表示代码的真正执行时间,而是表示代码执行时间随数据规模增长的变化趋势。 当n很大时,低阶、常量、系数并不能影响其增长趋势,因此可以…

压缩感知重构之广义正交匹配追踪法

算法的重构是压缩感知中重要的一步,是压缩感知的关键之处。因为重构算法关系着信号能否精确重建,国内外的研究学者致力于压缩感知的信号重建,并且取得了很大的进展,提出了很多的重构算法,每种算法都各有自己的优缺点&a…

RFID在工业自动化产线工艺中的应用

RFID在工业自动化产线工艺中的应用 随着工业自动化技术的不断发展,RFID(Radio Frequency Identification)技术在自动化产线数据采集方面得到了广泛应用。RFID技术是一种通过电磁波进行无线通信和识别的技术,它可以对物品进行追踪…

电子器件系列39:反激式变压器

反激式(Flyback)变压器又称单端反激式或Buck-Boost转换器。因其输出端在原边绕组断开电源时获得能量故而得名。反激式变换器以其电路结构简单,成本低廉而深受广大开发工程师的喜爱。 反激式变压器适合小功率电源以及各种电源适配器。但是反激式变换器的设计难点是变…

Oracle中的数据导出(1)

目录 1、基本语法: 2、操作步骤 3、spool作用 SPOOL命令的使用 在 Oracle 中,SPOOL 是一条 SQLPLUS 命令,用于将执行 SQL 脚本的输出结果保存到指定文件中。SPOOL 命令可以帮助用户快速导出查询结果、生成报表等常见任务。 1、基本语法&…

压缩感知重构算法之正交匹配追踪算法(OMP)

算法的重构是压缩感知中重要的一步,是压缩感知的关键之处。因为重构算法关系着信号能否精确重建,国内外的研究学者致力于压缩感知的信号重建,并且取得了很大的进展,提出了很多的重构算法,每种算法都各有自己的优缺点&a…

java-面向对象

java-面向对象 面向对象 首先考虑事物中存在哪些对象,再建立对象与对象的关系 一、面向对象-(类和对象) 1.1类和对象的理解 客观存在的事物皆为对象 ,所以我们也常常说万物皆对象。 类 类的理解 类是对现实生活中一类具有共同属性…

java-字符流和字节流(一)

java-字符流和字节流(一) 一、File类 1.1 File类概述和构造方法 File类介绍 它是文件和目录路径名的抽象表示文件和目录是可以通过File封装成对象的对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也…

【C++ 程序设计】第 1 章:C++ 语言简介

目录 一、C 语言的发展简史 二、C 语言的特点 (1)基本的输入/输出 (2)头文件和命名空间 (3)强制类型转换运算符 (4)函数参数的默认值 (5)引用和函数…

超简单好看的HTML5七夕情人节表白网页(表白直接拿去用) HTML+CSS+JS

博主:命运之光 专栏:web开发(html css js) 目录 ✨简介: ✨前言: ✨视频展示 ✨源代码 ✨代码的使用方法(超简单什么都不用下载) 🍓1.打开记事本 🍓2.将…

springboot+vue高校食堂点餐送餐配送系统

食堂送餐系统的开发过程中,采用B / S架构,主要使用java语言进行开发,结合最新流行的springboot框架。使用Mysql数据库和Eclipse/idea开发工具。该四川工商学院食堂送餐系统包括用户、商家、送餐员和管理员。其主要功能包括商家管理、用户管理…

【Azure】微软 Azure 基础解析(八)Azure 存储服务:Blob存储、队列存储、文件存储等特点与应用场景

本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」 专栏中。 本系列文章列表如下: 【Azure】微软 Azure 基础解析(三)描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx…

chatgpt赋能python:Python创建节点:简单易行的SEO优化技巧

Python创建节点:简单易行的SEO优化技巧 简介 在今天的数字时代,拥有强大在线存在感已经成为了非常重要的一种要素,而搜索引擎优化(SEO)就是其中重要的一环。优秀的SEO技巧不仅能够帮助网站吸引更多的访客&#xff0c…

chatgpt赋能python:Python编程实现高效的SEO搜索程序

Python编程实现高效的SEO搜索程序 在当今互联网时代,搜索引擎是人类获取信息的主要途径,而优化搜索引擎结果从而使自己的网站得到更多展示机会是一直以来网站优化重要的一环。Python语言以其简洁、高效、易学的特点,成为了编写高效SEO搜索程…

Linux 实操篇--定时任务调度

Linux 实操篇-定时任务调度 crond 任务调度 crontab 进行定时任务的设置 概述 任务调度:是指系统在某个时间执行的特定的命令或程序。 任务调度分类:1.系统工作:有些重要的工作必须周而复始地执行。如病毒扫描等 个别用户工作&#xff…

java-基础语法(二)

java-基础语法(二) 一、流程控制语句 1.1 流程控制语句分类 顺序结构 分支结构(if, switch) 循环 结构(for, while, do…while) 1.2 顺序结构 顺序结构执行流程图: 1.3 分支结构之if语句 if语句格式1 格式:if (关系表达式) {语句体; }执行流程&…

04.JavaWeb-Tomcat服务器+Maven

1.B/S架构 B/S架构即浏览器/服务器模式,他是对C/S架构的一种改进;与C/S架构相比B/S架构可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。 2.Tomcat服务器 Tomcat是一个用于运行Java Web应用程序的服务器&…