工厂设计模式

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.mzph.cn/news/78250.shtml

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

相关文章

一点整理

(1) 美国在2010年以后开始流行数字化转型的。 在2010年以前, 2006年社交网络FB “YOU”:在2004-2006 Web2.0热之前,企业是无法直接触达到每个消费者的2006年Amazon电子商务:这个是我瞎凑的,但因…

运算放大器学习笔记

目录 一、基本定理二、基本定义三、负反馈电路四、同向放大电路五、反向放大电路六、差分放大电路 一、基本定理 【电路示意图】 开环放大公式 VOAvo(V-V-) 开环放大倍数(增益)非常大,105 或 106 输入阻抗超级大(可以理解为电…

八股文学习一(存储)

一. 存储 行式存储的原理与特点 对于 OLAP 场景,大多都是对一整行记录进行增删改查操作的,那么行式存储采用以行的行式在磁盘上存储数据就是一个不错的选择。 当查询基于需求字段查询和返回结果时,由于这些字段都埋藏在各行数据中&#xf…

Uniapp学习之从零开始写一个简单的小程序demo(新建页面,通过导航切换页面,发送请求)

先把官网文档摆在这,后面会用到的 [uniapp官网文档]: https://uniapp.dcloud.net.cn/vernacular.html# 一、开发工具准备 1-1 安装HBuilder 按照官方推荐,先装一个HBuilder 下载地址: https://www.dcloud.io/hbuilderx.html1-2 安装微信开…

chrome插件:一个基于webpack + react的chrome 插件项目模板

项目结构 $ tree -L 1 . ├── README.md ├── node_modules # npm依赖 ├── package.json # 详细依赖 ├── pnpm-lock.yaml ├── public # 里边包含dist,安装的时候安装这个目录即可 ├── src …

postgre 12.11单实例安装文档

一 下载 访问https://www.postgresql.org/download/,点击左侧的‘source进行下载,一般选择bz2的安装包。 二 安装 这里安装12.11版本的postgre,数据目录路径为/data/server/pgdata,端口为5432. 2.1 安装依赖包 #安装 yum in…

C++信息学奥赛1171:大整数的因子

该程序是一个寻找能够整除输入数字的最小正整数的程序。下面是代码的逻辑解析&#xff1a; #include <iostream> #include <string> #include <cstring>using namespace std;int main() {string n; // 定义一个字符串变量nint fale 0; // 用于标记是否能…

企业形象片宣传片策划要从哪里展开

企业形象片宣传片是一种有效的营销工具&#xff0c;能够向潜在客户传达企业的核心价值观、品牌形象和产品服务。对于企业来说&#xff0c;一个成功的宣传片可以增加品牌知名度&#xff0c;提高销售额&#xff0c;并建立与客户的良好关系。然而&#xff0c;要想策划一部成功的企…

换行符转换

将\t\n、\n、多个\n\n\n...转换为\n\n。 import pandas as pd import re # 创建一个示例DataFrame data {msgText: [这是示例文本1&#xff0c;包含\t\n换行符,这是示例文本2&#xff0c;包含\n\n多个\n换行符,这是示例文本3&#xff0c;没有换行符]} df pd.DataFrame(data)…

多语言开发(vant

参考&#xff1a;https://blog.csdn.net/qq_44649801/article/details/131878128?spm1001.2014.3001.5506 一、抛出字段对象A export default { } 二、引入汇总文件&#xff0c;&#xff08;主要的是 模块分割 汇总&#xff0c;对A 等的处理 export default { A&#xff0c;B,…

Redis RedLock算法和底层源码分析

Redlock红锁算法 官网地址&#xff1a;Distributed Locks with Redis | Redis 为什么要使用RedLock&#xff1f; 解释&#xff1a; 线程 1 首先获取锁成功&#xff0c;将键值对写入 redis 的 master 节点&#xff0c;在 redis 将该键值对同步到 slave 节点之前&#xff0c;mas…

使用 CSS 伪类的attr() 展示 tooltip

效果图: 使用场景: 使用React渲染后台返回的数据, 遍历以列表的形式展示, 可能简要字段内容需要鼠标放上去才显示的 可以借助DOM的自定义属性和CSS伪类的attr来实现 所有代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-…

Navicat导入Excel数据顺序变了

项目场景&#xff1a; Navicat导入Excel数据 问题描述 从Excel表格中导入数据到数据库中。但是&#xff0c;在导入的过程中&#xff0c;我们常会发现数据顺序出现了问题&#xff0c;导致数据错位&#xff0c;给数据的处理带来了极大的麻烦。 原因分析&#xff1a; 这个问题的…

vue2.X 中使用 echarts5.4.0实现项目进度甘特图

vue2.X 中使用 echarts5.4.0实现项目进度甘特图 效果图&#xff1a; 左侧都是名称&#xff0c;上面是时间&#xff0c;当中的内容是日志内容 组件&#xff1a; gantt.vue <template><div id"main" style"width: 100%; height: 100%"></…

Ansys Zemax | 用于照明设计中的光源

本课程提供照明系统中光源的介绍&#xff0c;作为照明系统光源的信息中心。本课是照明学习路径的第二课。在这一课中&#xff0c;将描述照明系统中的各种光源类型以及如何这些使用光源。光源是照明系统的起点和支点&#xff0c;可以说是照明设计中最关键的部分。 简介&#xff…

华为云云耀云服务器L实例评测|基于云耀云服务器部署Samba服务

本实验将使用华为云云耀云服务器L实例&#xff0c;使用CentOS 7.9系统&#xff0c;搭建部署Samba服务器&#xff0c;并在本地Windows端进行访问。 文章目录 1、samba介绍2、环境准备3、安装samba软件包4、修改smb.conf配置文件5、添加访问samba的用户6、Windows下访问Samba服务…

使用 multiprocessing 多进程处理批量数据

示例代码 import multiprocessingdef process_data(data):# 这里是处理单个数据的过程return data * 2# 待处理的数据 data [1, 2, 3, 4, 5]def normal_func():# 普通处理方式result []for obj in data:result.append(process_data(obj)return resultdef parallel_func():# …

【FAQ】视频监控管理平台/视频汇聚平台EasyCVR安全检查相关问题及解决方法3.0

智能视频监控系统/视频云存储/集中存储/视频汇聚平台EasyCVR具备视频融合汇聚能力&#xff0c;作为安防视频监控综合管理平台&#xff0c;它支持多协议接入、多格式视频流分发&#xff0c;视频监控综合管理平台EasyCVR支持海量视频汇聚管理&#xff0c;可应用在多样化的场景上&…

Flink、Spark、Hive集成Hudi

环境描述: hudi版本:0.13.1 flink版本:flink-1.15.2 spark版本:3.3.2 Hive版本:3.1.3 Hadoop版本:3.3.4 一.Flink集成Hive 1.拷贝hadoop包到Flink lib目录 hadoop-client-api-3.3.4.jar hadoop-client-runtime-3.3.4.jar 2.下载上传flink-hive的jar包 flink-co…

算法 数据结构 递归冒泡算法 java冒泡算法 优化递归冒泡 数据结构(九)

使用递归算法实现冒泡&#xff1a; package com.nami.algorithm.study.day06;import java.util.Arrays;/*** beyond u self and trust u self.** Author: lbc* Date: 2023-09-05 15:36* email: 594599620qq.com* Description: keep coding*/ public class BubbleSort2 {// p…