[SSM]GoF之工厂模式

目录

六、GoF之工厂模式

6.1工厂模式的三种形态

6.2简单工厂模式

6.3工厂方法模式

6.4抽象工厂模式(了解)


六、GoF之工厂模式

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

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

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

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

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

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

      • 单例模式

      • ⼯⼚⽅法模式

      • 抽象⼯⼚模式

      • 建造者模式

      • 原型模式

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

      • 代理模式

      • 装饰模式

      • 适配器模式

      • 组合模式

      • 享元模式

      • 外观模式

      • 桥接模式

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

      • 策略模式

      • 模板⽅法模式

      • 责任链模式

      • 观察者模式

      • 迭代⼦模式

      • 命令模式

      • 备忘录模式

      • 状态模式

      • 访问者模式

      • 中介者模式

      • 解释器模式

6.1工厂模式的三种形态

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

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

    • 第二种:工厂方法模式:是23种设计模式之一。

    • 第三种:抽象工厂模式:是23种设计模式之一。

6.2简单工厂模式

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

    • 抽象产品角色

    • 具体产品角色

    • 工厂类角色

抽象产品角色

package com.hhb.factory;
​
//抽象产品角色
public abstract class Weapon {//所有的武器都可以攻击public abstract void attack();
}

具体产品角色

package com.hhb.factory;
​
//具体产品角色
public class Tank extends Weapon {@Overridepublic void attack() {System.out.println("坦克");}
}
package com.hhb.factory;
​
//具体产品角色
public class Dagger extends Weapon {@Overridepublic void attack() {System.out.println("匕首");}
}

工厂类角色

package com.hhb.factory;
​
//工厂类角色
public class WeaponFactory {/*** 简单工厂模式种有一个静态方法,所以被称为:静态工厂方法模式。** @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 {throw new RuntimeException("不支持该武器的生产");}}
}

客户端

package com.hhb.factory;
​
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();}
}
  • 简单工厂模式的优点:

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

  • 简单工厂模式的缺点:

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

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

6.3工厂方法模式

  • 工厂方法模式既保留了简单工厂模式的优点,同时又解决了简单工厂模式的缺点。

  • 工厂方法模式的角色包括:

    • 抽象工厂模式

    • 具体工厂模式

    • 抽象产品角色

    • 具体产品角色

抽象产品角色

package com.hhb.method;
​
//抽象产品角色
public abstract class Weapon {public abstract void attack();
}

具体产品角色

package com.hhb.method;
​
//具体产品角色
public class Gun extends Weapon {@Overridepublic void attack() {System.out.println("枪");}
}
package com.hhb.method;
​
//具体产品角色
public class Dagger extends Weapon {
​@Overridepublic void attack() {System.out.println("匕首");}
}

抽象工厂角色

package com.hhb.method;
​
//抽象工厂角色
public abstract class WeaponFactory {public abstract Weapon get();
}

具体工厂角色

package com.hhb.method;
​
//具体工厂角色
public class GunFactory extends WeaponFactory {@Overridepublic Weapon get() {return new Gun();}
}
package com.hhb.method;
​
public class DaggerFactory extends WeaponFactory {@Overridepublic Weapon get() {return new Dagger();}
}

客户端

package com.hhb.method;
​
//客户端程序
public class Test {public static void main(String[] args) {WeaponFactory weaponFactory = new DaggerFactory();Weapon dagger = weaponFactory.get();dagger.attack();
​WeaponFactory weaponFactory1 = new GunFactory();Weapon gun = weaponFactory1.get();gun.attack();}
}
  • 工厂方法模式优点:

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

    • 扩展性高,符号OCP原则,想要增加一个产品,只需要扩展一个工厂类就可以了。

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

  • 工厂方法模式的缺点:

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

6.4抽象工厂模式(了解)

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

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

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

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

相关文章

阿里云服务器 用docker部署mysql

阿里云服务器上使用Docker部署MySQL 当您在阿里云服务器上使用Docker部署MySQL时,步骤如下: 登录到阿里云服务器:使用SSH工具登录到您的阿里云服务器。您可以使用命令行工具(如OpenSSH)或可视化工具(如PuT…

银河麒麟高级服务器操作系统V10安装mysql数据库

一、安装前 1.检查是否已经安装mysql rpm -qa | grep mysql2.将查询出的包卸载掉 rpm -e --nodeps 文件名3.将/usr/lib64/libLLVM-7.so删除 rm -rf /usr/lib64/libLLVM-7.so4.检查删除结果 rpm -qa | grep mysql5.搜索残余文件 whereis mysql6.删除残余文件 rm -rf /usr/b…

利用JavaScript判断页面宽度的响应式布局方法

首先前端中&#xff0c;样式尺寸单位全部用rem&#xff0c;比如&#xff1a; .content{ width: 8rem; border-radius: 0.15rem; font-size: 0.95rem; letter-spacing: 0.15rem; &#xff5d; 接着页面中的html给个默认的font-size样式&#xff0c;比如&#xff1a; <html …

MYSQL表操作(DML,DDL)

建表并插入数据&#xff1a; mysql> create table worker(-> dept_id int(11) not null,-> emp_id int (11) not null,-> work_time date not null,-> salary float(8,2) not null,-> poli_face varchar(10) not null default 群众,-> name varchar(20) …

一种对不同类型齐格勒-尼科尔斯 P-I-D 控制器调谐算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL数据库 【增删改查】

目录 一、新增 指定列插入 一次插入多个数据 二、查询 1、全列查询 2、指定列查询 3、查询字段为表达式 4、查询的时候给列名/表达式 指定别名 5、查询时去重 6、排序查询 7、条件查询 8、模糊查询 9、空值查询 10、分页查询 三、修改 四、删除 SQL 最核心…

11、JSON.parse 数据不完整

一、问题描述 使用 JSON.parse 反序列化&#xff0c;出现数据丢失现象。 字符串json数据&#xff1a; {"varImageList": [{"variationValue": "Black ","imageList": [{"variationValue": "Black ","imag…

JS-26 认识防抖和节流函数;自定义防抖、节流函数;自定义深拷贝、事件总线函数

目录 1_防抖和节流1.1_认识防抖和节流函数1.2_认识防抖debounce函数1.3_防抖函数的案例1.4_认识节流throttle函数 2_Underscore实现防抖和节流2.1_Underscore实现防抖和节流2.2_自定义防抖函数2.3_自定义节流函数 3_自定义深拷贝函数4_自定义事件总线 1_防抖和节流 1.1_认识防…

你是不是一个好的测试工程师?

如何评价一个程序员是否优秀一直是一个很有争议的话题。 先说一个真实事件&#xff0c;国际化项目&#xff0c;最开始都是由产品经理在excel中管理翻译&#xff0c;迭代过程中如有增删改&#xff0c;就把增删改的部分标记出来&#xff0c;提供给开发&#xff0c;开发再对应更新…

关于gateway中lb失效

在通过gateway将请求发送到对应的服务模块时&#xff0c;出现了503的报错&#xff0c;也就是gateway时可以正常启动&#xff0c;但是页面上在发送请求获取数据的时候&#xff0c;却不是相应的请求地址。 解决方法&#xff1a; 1.首先你得保证前端项目里面访问网关地址都是正确…

【Netty】NIO基础(三大组件、文件编程)

文章目录 三大组件Channel & BufferSelector ByteBufferByteBuffer 正确使用姿势ByteBuffer 内部结构ByteBuffer 常见方法分配空间向 buffer 写入数据从 buffer 读取数据mark 和 reset 字符串与 ByteBuffer 互转Scattering ReadsGathering Writes粘包、半包分析 文件编程Fi…

vue 当新增样式无法生效的情况下如何处理

使用scoped属性时&#xff0c;会遇到样式问题。需要使用样式穿透解决 <style lang"scss" scoped> </style> 可以使用以下方法 &#xff1a;deep css 使用 >>> less 使用 /deep/ scss 使用 ::v-deep 代码写法如下: .a :deep(.b) { } .…

v-show和v-if的区别以及显示隐藏不生效的奇怪现象以及点击索引错位问题的解释

基本概念没什么好讲的。有时候会遇到莫名其妙不显示的问题&#xff0c;这都是因为对这两个概念理解不透彻造成的。 v-show的本质 v-show的本质就是通过调用css的display:none来实现的&#xff0c;这点非常重要&#xff0c;出问题可以在浏览器调试页面手动设置display:none来验…

Mac的docker安装redis

Mac的docker安装redis 1、docker search redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis Redis is an open source key-value store that… 12205 …

mysql、redis 、RabbitMQ只能本机访问,怎么改?

如果只能本机访问&#xff0c;怎么改? 一、mysql - 改my.ini 刷脚本 bind-address0.0.0.0 然后重启一下mysql服务 任务管理器-关掉mysql 搜索 计算机管理-重启mysql服务 然后 打开查询&#xff0c;并选择mysql数据&#xff0c;输入这个sql语句&#xff0c;点击运行 sele…

SpringAMQP使用

说明&#xff1a;SpringAMQP&#xff08;官网&#xff1a;https://spring.io/projects/spring-amqp&#xff09;是基于RabbitMQ封装的一套模板&#xff0c;并利用了SpringBoot对其实现了自动装配&#xff0c;使用起来非常方便。安装和原始使用参考&#xff1a;http://t.csdn.cn…

视频做成GIF动图怎么做?分享超简单的制作方法

将视频制作GIF动图的好处在于它可以将原本较长的视频压缩成一个简短、易于分享的图像文件。这使得它们非常适合用于社交媒体、博客、电子邮件等场景&#xff0c;可以当做表情包来使用&#xff0c;尤其是看到一段搞笑的视频&#xff0c;想要把它做成GIF动图该怎么做呢&#xff1…

机器学习混淆矩阵笔记

混淆矩阵&#xff08;Confusion Matrix&#xff09;是在机器学习和统计学中用于评估分类模型性能的一种表格。它可以显示模型预测结果与真实标签之间的对应关系&#xff0c;从而提供了对分类模型性能的全面评估。 混淆矩阵的结构是一个二维矩阵&#xff0c;通常是一个2x2的矩阵…

常见java知识点1

目录 1 什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; 2 使用Spring框架有什么好处&#xff1f; 3 Java常用的包&#xff08;列举六个&#xff09; 4 Arraylist 和 Linkedlist 的区别 5 HashMap和Hashtable的区别 6 Java中常见的…

小白到运维工程师的自学之路 第五十四集 (ansible自动化运维工具)

一、概述 Ansible是一种开源的自动化工具&#xff0c;用于自动化任务的执行、配置管理和应用部署。它采用基于Python编写的简单、轻量级的语法&#xff0c;可以通过SSH协议远程管理和配置多台计算机。 Ansible的主要特点包括&#xff1a; 1、简单易用&#xff1a;设计简单&a…