【Spring】GoF 之工厂模式

一、GoF 23 设计模式简介

  • 设计模式:一种可以被重复利用的解决方案

  • GoF(Gang of Four),中文名——四人组

  • 《Design Patterns: Elements of Reusable Object-Oriented Software》(即《设计模式》一书),1995年由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著,这几位作者常被称为"四人组(Gang of Four)"

  • 该书中描述了 23 种设计模式,我们平常所说的设计模式就是指这 23 种设计模式

  • 不过除了 GoF23 种设计模式之外,还有其它的设计模式,比如:JavaEE 的设计模式(DAO模式、MVC模式等)

  • GoF23 种设计模式可分为三大类

    • 创建型(5个):解决对象创建问题

      • 单例模式

      • 工厂方法模式

      • 抽象工厂模式

      • 建造者模式

      • 原型模式

    • 结构型(7个):一些类或对象组合在一起的经典结构

      • 代理模式

      • 装饰模式

      • 适配器模式

      • 组合模式

      • 享元模式

      • 外观模式

      • 桥接模式

    • 行为型(11个):解决类或对象之间的交互问题

      • 策略模式

      • 模板方法模式

      • 责任链模式

      • 观察者模式

      • 迭代子模式

      • 命令模式

      • 备忘录模式

      • 状态模式

      • 访问者模式

      • 中介者模式

      • 解释器模式

工厂模式是解决对象创建问题的,所以工厂模式属于创建型设计模式

这里为什么学习工厂模式呢?这是因为 Spring 框架底层使用了大量的工厂模式

 

二、工厂模式的三种形态 

工厂模式通常有三种形态:

  • 第一种:简单工厂模式(Simple Factory):不属于23种设计模式之一,简单工厂模式又叫做:静态 工厂方法模式。简单工厂模式是工厂方法模式的一种特殊实现

  • 第二种:工厂方法模式(Factory Method):是 23 种设计模式之一

  • 第三种:抽象工厂模式(Abstract Factory):是 23 种设计模式之一

 

三、简单工厂模式 

简单工厂模式的角色包括三个:

  • 抽象产品 角色

  • 具体产品 角色

  • 工厂类 角色

简单工厂模式的代码如下:

package org.qiu.simple.factory;/*** 抽象产品角色* @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package org.qiu.simple.factory* @date 2022-11-09-21:53* @since 1.0*/
public abstract class Weapon {/*** 所有的武器都可以攻击*/public abstract void attack();
}
package org.qiu.simple.factory;/*** 具体产品角色* @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package org.qiu.simple.factory* @date 2022-11-09-21:54* @since 1.0*/
public class Tank  extends Weapon{@Overridepublic void attack() {System.out.println("二营长你他娘的意大利炮呢???");}
}
package org.qiu.simple.factory;/*** 具体产品角色* @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package org.qiu.simple.factory* @date 2022-11-09-21:55* @since 1.0*/
public class Fighter extends Weapon{@Overridepublic void attack() {System.out.println("战斗机抛下小男孩!!!");}
}
package org.qiu.simple.factory;/*** 具体产品角色* @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package org.qiu.simple.factory* @date 2022-11-09-21:55* @since 1.0*/
public class Dagger  extends Weapon{@Overridepublic void attack() {System.out.println("砍他丫的!!!");}
}
package org.qiu.simple.factory;/*** @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package org.qiu.simple.factory* @date 2022-11-09-21:57* @since 1.0*/
public class WeaponFactory {/*** 静态方法* 要获取什么产品,就看传什么参数* 传 TANK 获取坦克* 传 DAGGER 获取匕首* 传 FIGHTER 获取战斗机* @param weaponType* @return*/public static Weapon get(String weaponType){if ("TANK".equals(weaponType)) {return new Tank();} else if ("DAGGER".equals(weaponType)) {return new Dagger();} else if ("FIGHTER".equals(weaponType)){return new Fighter();} else {throw new RuntimeException("暂不支持该武器的生产");}}
}
public class Test {public static void main(String[] args) {// 坦克对象Weapon tank = WeaponFactory.get("TANK");tank.attack();// 匕首对象Weapon dagger = WeaponFactory.get("DAGGER");dagger.attack();// 战斗机对象Weapon fighter = WeaponFactory.get("FIGHTER");fighter.attack();}
}

运行结果: 

简单工厂模式的优点:

  • 客户端程序不需要关心对象的创建细节,需要哪个对象时,只需要向工厂索要即可,初步实现了责任的分离,客户端只负责“消费”,工厂负责“生产”,生产和消费分离。

简单工厂模式的缺点:

  • 缺点1:工厂类集中了所有产品的创造逻辑,形成一个无所不知的全能类,有人把它叫做上帝类。显然工厂类非常关键,不能出问题,一旦出问题,整个系统瘫痪

  • 缺点2:不符合 OCP 开闭原则,在进行系统扩展时,需要修改工厂类

Spring 中的 BeanFactory 就使用了简单工厂模式。

 

四、工厂方法模式 

工厂方法模式的角色:

  • 抽象产品角色

  • 具体产品角色

  • 抽象工厂角色

  • 具体工厂角色

/*** @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package PACKAGE_NAME* @date 2022-11-10-16:58* @since 1.0*/
public abstract class Weapon {public abstract void attack();
}
/*** @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package PACKAGE_NAME* @date 2022-11-10-16:58* @since 1.0*/
public class Dagger extends Weapon{@Overridepublic void attack() {System.out.println("刀他丫的!!!");}
}
/*** @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package PACKAGE_NAME* @date 2022-11-10-16:59* @since 1.0*/
public class Gun extends Weapon{@Overridepublic void attack() {System.out.println("biu~ biu~ biu~");}
}
/*** @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package PACKAGE_NAME* @date 2022-11-10-17:00* @since 1.0*/
public abstract class WeaponFactory {public abstract Weapon get();
}
/*** @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package PACKAGE_NAME* @date 2022-11-10-17:01* @since 1.0*/
public class DaggerFactory extends WeaponFactory{@Overridepublic Weapon get() {return new Dagger();}
}
/*** @author 秋玄* @version 1.0* @email qiu_2022@aliyun.com* @project Spring* @package PACKAGE_NAME* @date 2022-11-10-17:01* @since 1.0*/
public class GunFactory extends WeaponFactory{@Overridepublic Weapon get() {return new Gun();}
}
public class Test {public static void main(String[] args) {WeaponFactory daggerFactory = new DaggerFactory();Weapon dagger = daggerFactory.get();dagger.attack();GunFactory gunFactory = new GunFactory();Weapon gun = gunFactory.get();gun.attack();}
}

运行结果:

厂方法模式的优点:

  • 一个调用者想创建一个对象,只要知道其名称就可以了。

  • 扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以

  • 屏蔽产品的具体实现,调用者只关心产品的接口

工厂方法模式的缺点:

  • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖,这并不是什么好事

 

五、抽象工厂模式(了解即可) 

抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。

抽象工厂模式特点:

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结果。

抽象工厂中包含4个角色:

  • 抽象工厂角色

  • 具体工厂角色

  • 抽象产品角色

  • 具体产品角色

抽象工厂模式的类图如下:

抽象工厂模式的优缺点:

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

  • 缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在AbstractFactory里加代码,又要在具体的里面加代码

 

一  叶  知  秋,奥  妙  玄  心

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

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

相关文章

JavaEE作业-实验三

目录 1 实验内容 2 实验要求 3 思路 4 核心代码 5 实验结果 1 实验内容 简单的线上图书交易系统的web层 2 实验要求 ①采用SpringMVC框架,采用REST风格 ②要求具有如下功能:商品分类、订单、购物车、库存 ③独立完成,编写实验报告 …

Unity2D 学习笔记 0.Unity需要记住的常用知识

Unity2D 学习笔记 0.Unity需要记住的常用知识 前言调整Project SettingTilemap相关(创建地图块)C#脚本相关程序运行函数private void Awake()void Start()void Update() Collider2D碰撞检测private void OnTriggerStay2D(Collider2D player)private void…

猫头虎分享已解决Bug || docker: Error response from daemon: network not found

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

基于华为云欧拉操作系统(HCE OS)单节点容器化部署(Prometheus、node-exporter、Grafana)应用性能监控平台

写在前面 博文内容为 华为云欧拉操作系统入门级开发者认证(HCCDA – Huawei Cloud EulerOS)实验笔记整理认证地址:https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1内容涉及,HCE OS 容器化部署(Prometheus、…

分布式springboot 3项目集成mybatis官方生成器开发记录

文章目录 说明实现思路实现步骤第一步:创建generator子模块第二步:引入相关maven插件和依赖第三步:编写生成器配置文件第四步:运行查看结果 说明 该文章为作者开发学习记录,方便以后复习和交流主要内容为:…

【精选】java继承进阶——构造方法的访问特点 this、super使用

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

算法导论 总结索引 | 第一部分 第三章:函数的增长

研究算法的 渐近效率 1、渐近记号(40) 1、Θ: 使得 对于足够大的n,函数 f(n) 能 夹入 c1g(n) 与 c2g(n) 之间,则 f(n) ∈ 集合Θ(g(n)) g(n) 是 f(n) 的一个渐近紧确界 g(n)本身 必为渐近非负 使用 Θ(1) 来意指 …

【Spring源码解读!底层原理进阶】【下】探寻Spring内部:BeanFactory和ApplicationContext实现原理揭秘✨

🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏《Spring 狂野之旅:底层原理高级进阶》 &#x1f680…

[超分辨率重建]ESRGAN算法训练自己的数据集过程

一、下载数据集及项目包 1. 数据集 1.1 文件夹框架的介绍,如下图所示:主要有train和val,分别有高清(HR)和低清(LR)的图像。 1.2 原图先通过分割尺寸的脚本先将数据集图片处理成两个相同的图像…

c++之说_13|模板 折叠表达式

折叠表达式 可以通过形参包的的实际参数&#xff08;不是类型&#xff09; 展开式子 这是这里说的几种 实际上并还有一些写法 先介绍这几种吧 #include <cstdio> template<typename T,T... n> struct integer_sequence {T val; }; template<int idx,typenam…

GEE详细教程之:将Landsat8与Landsat9影像合成一个影像

1.前言 因项目需求&#xff0c;需要获取一个研究区的Landsat8影像&#xff0c;但Landsat8重复周期长&#xff0c;加之天气的影响&#xff0c;很难获取影像质量较好的影像。Landsat4/5/7的波段顺序与landsat8不同&#xff0c;除此之外&#xff0c;landsat7影像还需要工具进行条带…

【PyQt】08 - 编辑Tab顺序

文章目录 前言一、Tab顺序二、编辑Tab顺序总结 前言 介绍了什么是Tab顺序&#xff0c;以及如何修改Tab顺序。 一、Tab顺序 当你的界面设计好之后&#xff0c;在输入栏按住Tab按键&#xff0c;他会按照你摆放的顺序一次转跳 二、编辑Tab顺序 方法一 然后鼠标左击就可以改变…

阿里云参编业内首个代码大模型标准丨云原生 2024 年 1 月产品技术动态

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 阿里云参编业内首个代码大模型标准&#xff0c;通…

LLaVA-1.6:多模态AI新标准,中文零样本能力与低成本训练革命,性能全面超越Gemini Pro

引言 2023年10月&#xff0c;LLaVA-1.5凭借其简洁高效的设计和在12个数据集上的出色表现&#xff0c;为大规模多模态模型&#xff08;LMM&#xff09;的研究和应用奠定了基础。进入2024年&#xff0c;我们迎来了LLaVA-1.6&#xff0c;一个在理性推理、光学字符识别&#xff08…

LeetCode1365之切披萨的方案数(相关话题:二维前缀和,动态规划)

题目描述 给你一个 rows x cols 大小的矩形披萨和一个整数 k &#xff0c;矩形包含两种字符&#xff1a; A &#xff08;表示苹果&#xff09;和 . &#xff08;表示空白格子&#xff09;。你需要切披萨 k-1 次&#xff0c;得到 k 块披萨并送给别人。 切披萨的每一刀&#xf…

Bpmn-js自定义Palette元素

Bpmn-js作为一个流程编辑器&#xff0c;常规的我们可以将其划分为几个功能区域&#xff0c;每个区域对应的负责不同的功能实现&#xff0c;bpmn-js的设计给我们留下了大量的留白和可扩展区域&#xff0c;其每一部分都可进行组合拼装&#xff0c;同时也支持我们的各种不同层次需…

『运维备忘录』之 Kubernetes(K8S) 常用命令速查

一、简介 kubernetes&#xff0c;简称K8s&#xff0c;是用8代替名字中间的8个字符“ubernete”而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用。kubernetes是基于容器技术的分布式架构解决方案&#xff0c;具有完备的集群管理能力&a…

霍金《时间简史》(A Brief History of Time)学习笔记(第四章)

Chapter 4: The Uncertainty Principle Footnote: Chapter 4. Mainly talks about Werner Heisenberg’s Uncertainty Principle. Vital principle in modern physics, concept not hard to understand——work of a genius mind. Footnote: Werner Heisenberg, German physici…

【蓝桥杯冲冲冲】Invasion of the Milkweed G

【蓝桥杯冲冲冲】Invasion of the Milkweed G 蓝桥杯备赛 | 洛谷做题打卡day30 文章目录 蓝桥杯备赛 | 洛谷做题打卡day30[USACO09OCT] Invasion of the Milkweed G题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 题解代码我的一些话 [USACO09OCT] Invasion of the Mi…

斯巴鲁Subaru EDI需求分析

斯巴鲁Subaru是日本运输集团斯巴鲁公司&#xff08;前身为富士重工&#xff09;的汽车制造部门&#xff0c;以性能而闻名&#xff0c;曾赢得 3 次世界拉力锦标赛和 10 次澳大利亚拉力锦标赛。 斯巴鲁Subaru EDI 需求分析 企业与斯巴鲁Subaru建立EDI连接&#xff0c;首先需要确…