工厂设计模式

github:GitHub - QiuliangLee/pattern: 设计模式

概念

根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。

简单工厂模式、工厂方法模式和抽象工厂模式有何区别? - 知乎本篇详解简单工厂、工厂方法和抽象工厂,建议关注和收藏。在我们平常创建对象的时候,都是通过关键字 new…icon-default.png?t=N7T8https://www.zhihu.com/question/27125796/answer/1615074467

开闭原则 ocp: —个软件实体,应该对扩展开放,对修改关闭

应该通过扩展来实现变化,而不是通过修改已有的代码来实现变化

简单工厂:唯一工厂类,一个产品抽象类,工厂类的创建方法依据入参判断并创建具体产品对象。

工厂方法:多个工厂类,一个产品抽象类,利用多态创建不同的产品对象,避免了大量的if-else判断。

抽象工厂:多个工厂类,多个产品抽象类,产品子类分组,同一个工厂实现类创建同组中的不同产品,减少了工厂子类的数量。

需求分析

我想生产一批鼠标,鼠标品牌目前只有”联想“,”惠普“。惠普鼠标

没有工厂模式

缺点:不符合ocp

联想鼠标

​
public class LenovoMouse{public void build() {System.out.println("生产联想鼠标");}
}​

惠普鼠标

​
public class HPMouse{public void build() {System.out.println("生产惠普鼠标");}
}​

MouseDemo 

package com.lql.factory.no;import com.lql.factory.entity.HpMouse;
import com.lql.factory.entity.LenovoMouse;
import com.lql.factory.enums.MouseEnum;public class MouseDemo {public void getMouse(Integer type) {if (MouseEnum.LENOVO_MOUSE.getCode().equals(type)) {LenovoMouse lenovoMouse = new LenovoMouse();lenovoMouse.build();} else if (MouseEnum.HP_MOUSE.getCode().equals(type)) {HpMouse hpMouse = new HpMouse();hpMouse.build();} else {throw new IllegalArgumentException("无效的鼠标:" + type);}}
}

简单工厂模式

定义一个工厂类,根据传入的参数的值不同返回不同的实例,使得产品类满足OCP

特点:被创建的实例具有共同的父类或接口

使用场景:

  1. 客户端不关心对象的创建过程
  2. 需要创建的对象较少,修改对象不符合开闭原则.

缺点:工厂不满足OCP

Mouse接口
package com.lql.factory.entity;public interface Mouse {void build();
}
LenovoMouse
package com.lql.factory.entity;public class LenovoMouse implements Mouse {@Overridepublic void build() {System.out.println("生产联想鼠标");}
}
HpMouse
package com.lql.factory.entity;public class HpMouse implements Mouse {@Overridepublic void build() {System.out.println("生产惠普鼠标");}
}
MouseEnum
package com.lql.factory.enums;import lombok.AllArgsConstructor;
import lombok.Getter;@AllArgsConstructor
@Getter
public enum MouseEnum {LENOVO_MOUSE(1, "联想鼠标"),HP_MOUSE(2, "惠普鼠标");private final Integer code;private final String desc;
}
MouseFactory
package com.lql.factory.simplefactory;import com.lql.factory.entity.HpMouse;
import com.lql.factory.entity.LenovoMouse;
import com.lql.factory.entity.Mouse;public class MouseFactory {public static Mouse createMouse(Integer type) {switch (type) {case 1:return new LenovoMouse();case 2:return new HpMouse();default:return new LenovoMouse();}}
}

工厂模式

定义一个用于常见对象的接口,让子类决定实例化哪一个类

对类的实例化延迟到其子类

特点:不违反开闭原则(增加联想鼠标,不用修改已有代码,增加新的接口,LenvoMouse和 LenvoMouseFactory)

缺点:

(1)添加子类的时候”拖家带口”

(2)只支持同一类产品的创建

MouseFactory
package com.lql.factory.factorymethod;import com.lql.factory.entity.Mouse;public interface MouseFactory {Mouse createMouse();
}
LenovoMouseFactory
package com.lql.factory.factorymethod;import com.lql.factory.entity.LenovoMouse;
import com.lql.factory.entity.Mouse;public class LenovoMouseFactory implements MouseFactory {@Overridepublic Mouse createMouse() {return new LenovoMouse();}
}
HpMouseFactory
package com.lql.factory.factorymethod;import com.lql.factory.entity.HpMouse;
import com.lql.factory.entity.Mouse;public class HpMouseFactory implements MouseFactory {@Overridepublic Mouse createMouse() {return new HpMouse();}
}
FactoryMethodDemo
package com.lql.factory.factorymethod;import com.lql.factory.entity.Mouse;public class FactoryMethodDemo {public static void main(String[] args) {MouseFactory mf = new HpMouseFactory();Mouse mouse = mf.createMouse();mouse.build();}
}

抽象工程模式

提供一个创建一系列相关或相互依赖对象的接口

(1)抽象工厂模式侧重的是同一产品族(比如鼠标和键盘,统一厂商)

(2)工厂方法模式更加侧重于同一产品等级(比如鼠标)

增加主板时还是违背开闭原则,可以采用spring ioc与工厂模式相结合的方式解决.

Keyboard
package com.lql.factory.entity;public interface Keyboard {void build();
}
LenovoKeyboard
package com.lql.factory.entity;public class LenovoKeyboard implements Keyboard {@Overridepublic void build() {System.out.println("生产联想键盘");}
}
HpKeyboard
package com.lql.factory.entity;public class HpKeyboard implements Keyboard {@Overridepublic void build() {System.out.println("生产惠普键盘");}
}
ComputerFactory
package com.lql.factory.absfactory;import com.lql.factory.entity.Keyboard;
import com.lql.factory.entity.Mouse;public interface ComputerFactory {Mouse createMouse();Keyboard createKeyboard();
}
LenovoComputerFactory
package com.lql.factory.absfactory;import com.lql.factory.entity.Keyboard;
import com.lql.factory.entity.LenovoKeyboard;
import com.lql.factory.entity.LenovoMouse;
import com.lql.factory.entity.Mouse;public class LenovoComputerFactory implements ComputerFactory {@Overridepublic Mouse createMouse() {return new LenovoMouse();}@Overridepublic Keyboard createKeyboard() {return new LenovoKeyboard();}
}
DellComputerFactory
package com.lql.factory.absfactory;import com.lql.factory.entity.DellKeyboard;
import com.lql.factory.entity.DellMouse;
import com.lql.factory.entity.Keyboard;
import com.lql.factory.entity.Mouse;public class DellComputerFactory implements ComputerFactory {@Overridepublic Mouse createMouse() {return new DellMouse();}@Overridepublic Keyboard createKeyboard() {return new DellKeyboard();}
}

AbstractFactoryDemo
package com.lql.factory.absfactory;import com.lql.factory.entity.Keyboard;
import com.lql.factory.entity.Mouse;public class AbstractFactoryDemo {public static void main(String[] args) {ComputerFactory cf = new HpComputerFactory();Mouse mouse = cf.createMouse();Keyboard keyboard = cf.createKeyboard();mouse.build();keyboard.build();}
}

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

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

相关文章

SimVODIS++: Neural Semantic Visual Odometry in Dynamic Environments 论文阅读

论文信息 题目:SimVODIS: Neural Semantic Visual Odometry in Dynamic Environments 作者:Ue-Hwan Kim , Se-Ho Kim , and Jong-Hwan Kim , Fellow, IEEE 时间:2022 来源: IEEE ROBOTICS AND AUTOMATION LETTERS(RAL…

shell知识点复习

1、shell能做什么( Shell可以做任何事(一切取决于业务需求) ) 自动化批量系统初始化程序 自动化批量软件部署程序 应用管理程序 日志分析处理程序 自动化备份恢复程序 自动化管理程序 自动化信息采集及监控程序 配合Zabbix信息采集 自动化扩容 2、获取当…

【疑难杂症】解决 git 文件夹不显示绿色图标和红色图标的问题

目录 一、问题描述 二、问题解决前提 【2.1】首先保证电脑本机上有TortoiseGit这个软件 【2.2】TortoiseGit下载官网 【2.3】根据自己电脑位数进行下载,这里下载的是64位 【2.4】下载好之后,一路next进行安装,配置自己的邮箱和用户名 …

【TypeScript学习】—面向对象(四)

【TypeScript学习】—面向对象(四) 一、面向对象 二、类 三、构造方法 class Dog{name:string;age:number;//构造函数constructor(name:string,age:number){this.namename;this.ageage;}bark(){//在方法中可以通过this来表示当前调用方法的对象//this表…

Springboot整合AOP实现日志的保存

1.定义注解 /*** 系统日志元注解*/ Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) Documented public interface LogFilter {String value() default "" ; } 2.编写切面的实现 Aspect Component public class LogAspect {private static final …

[极客大挑战 2019]FinalSQL(bypass盲注)

这里是数字型注入,选择一个序号 fuzz ?id1这里过滤了很多东西 使用fuzzSQL字典,这是我自己定义编写的一个fuzz字典,内容较少 select from information . tables whereand " or | & union columns updatexml extractvalue databa…

微信小程序给 thinkphp后端发送请求出现错误 Wrong number of segments 问题的解决 【踩坑记录】

微信小程序给 thinkphp后端发送请求出现错误 Wrong number of segments 问题的解决 【踩坑记录】 微信小程序代码部分PHP后端部分错误显示解决方案及步骤(总结) 微信小程序代码部分 //给后端接口发送一个json请求,并且得通过token鉴权ToUpdatePwd(){wx.r…

【MySQL】一文详解MySQL,从基础概念到调优

作者简介 前言 博主之前写过一个MySQL的系列,从基础概念、SQL到底层原理、优化,专栏地址: https://blog.csdn.net/joker_zjn/category_12305262.html?spm1001.2014.3001.5482 本文会是这个系列的清单,拉通来聊一聊Mysql从基础概…

通讯软件019——分分钟学会Prosys OPC UA Server配置

本文介绍如何配置Prosys OPC UA Simulation Server,通过本文可以对OPC UA的基本概念有所了解,掌握OPC UA的本质。更多通信资源请登录网信智汇(wangxinzhihui.com)。 1、启动OPC UA Server Prosys OPC UA Simulation Server启动后就处于运行状态。 2、配…

【ARM CoreLink 系列 1 -- CoreLink 系列 产品介绍】

文章目录 ARM CoreLink 介绍ARM CoreLink InterconnectARM CoreLink 处理器外设ARM CoreLink Memory Controllers ARM CoreLink 介绍 ARM的CoreLink系列产品是一套能够进行高效互联的组件和工具,它们用于构建高性能、低功耗的嵌入式和消费电子设备。CoreLink产品系…

CUDA小白 - NPP(4) 图像处理 Data Exchange and Initialization(1)

cuda小白 原始API链接 NPP GPU架构近些年也有不少的变化,具体的可以参考别的博主的介绍,都比较详细。还有一些cuda中的专有名词的含义,可以参考《详解CUDA的Context、Stream、Warp、SM、SP、Kernel、Block、Grid》 常见的NppStatus&#xf…

【MySQL】表的约束

目录 MySQL表的约束 空属性 默认值 列描述 zerofill 主键 自增长 唯一键 外键 综合案例 MySQL表的约束 真正约束字段的是数据类型,如果插入的数据超出了对应数据类型的取值范围,那么数据将会插入失败。但是数据类型的约束很单一,为…

webpack(四)plugin

定义 和loader的区别 loader:文件加载器,能够加载资源,并对这些文件进行一些处理,诸如编译、压缩等,最终一起打包到指定的文件中。plugin:赋予了webpack各种灵活的功能,例如打包优化、资源管理、环境变量注入等&…

C++初阶:C++入门

目录 一.iostream文件 二.命名空间 2.1.命名空间的定义 2.2.命名空间的使用 三.C的输入输出 四.缺省参数 4.1.缺省参数概念 4.2.缺省参数分类 4.3.缺省参数注意事项 4.4.缺省参数用途 五.函数重载 5.1.重载函数概念 5.2.C支持函数重载的原理--名字修饰(name Mangl…

第 2 章 线性表(学生健康登记表实现)

1. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果状态码 */ #define TRUE 1 /* 返回值为真 */ #define FALSE 0 /* 返回值为假 */ #define RET_OK 0 /* 返回值正确 */ #define INFEASI…

【自学开发之旅】Flask-回顾--对象拆分-蓝图(二)

url-统一资源定位符-不同的url对应不同的资源 作为服务端&#xff0c;url和视图函数的映射关系就是路由。 定义传递参数的方式&#xff1a; 1.创建动态url app.route("/login2/<username>/<passwd>") def login2(username, passwd):if username "…

数据分析和可视化平台:Splunk Enterprise for mac v9.1.1激活版 兼容m1

Splunk Enterprise 是一个数据分析和可视化平台&#xff0c;可帮助企业理解其数据。虽然没有适用于 Mac OS 的 Splunk Enterprise 官方版本&#xff0c;但他们确实为 Mac OS 提供了一个名为“Splunk Light”的应用程序&#xff0c;它提供了基本的数据索引、搜索和仪表板。或者&…

基于Yolov8的中国交通标志(CCTSDB)识别检测系统

目录 1.Yolov8介绍 2.纸箱破损数据集介绍 2.1数据集划分 2.2 通过voc_label.py得到适合yolov8训练需要的 2.3生成内容如下 3.训练结果分析 1.Yolov8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&…

【数据分析】Python:处理缺失值的常见方法

在数据分析和机器学习中&#xff0c;缺失值是一种常见的现象。在实际数据集中&#xff0c;某些变量的某些条目可能没有可用的值。处理缺失值是一个重要的数据预处理步骤。在本文中&#xff0c;我们将介绍如何在 Pandas 中处理缺失值。 我们将探讨以下内容&#xff1a; 什么是缺…

Redis-带你深入学习数据类型list

目录 1、list列表 2、list相关命令 2.1、添加相关命令&#xff1a;rpush、lpush、linsert 2.2、查找相关命令&#xff1a;lrange、lindex、llen 2.3、删除相关命令&#xff1a;lpop、rpop、lrem、ltrim 2.4、修改相关命令&#xff1a;lset 2.5、阻塞相关命令&#xff1a…