工厂设计模式

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.hqwc.cn/news/107790.html

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

相关文章

【SpringCloudAlibaba】Seata分布式事务使用

文章目录 分布式事务问题示例Seata概述、官网一个典型的分布式事务过程处理过程全局GlobalTransactional分布式交易解决方案流程图 Seata安装下载修改conf目录下的application.yml配置文件dashboard demo 分布式事务问题示例 单体应用被拆分成微服务应用,原来的三个…

【微信小程序开发】一文学会使用视图组件进行界面设计

引言 在小程序开发中,界面设计是非常重要的一环。本文将介绍如何学习使用小程序的视图组件进行界面设计,并提供代码示例。 文章目录 引言1. 小程序视图组件简介2. 视图组件的使用方法2.1. 组件的引入2.2. 组件的使用2.3. 组件的事件绑定2.4. 组件的样式设…

微火资讯快报:共享wifi项目怎么样?

共享WiFi项目一直以来都是一个热门的创业方向,它通过将公共场所的WiFi热点转换成二维码,使用户扫码就可轻松地连接并使用网络,而商家也可以通过该平台实现广告宣传、营销推广等功能。下面就让我们来详细了解一下共享WiFi项目的各个方面。 市场…

推荐10个AI人工智能技术网站(一键收藏,应有尽有)

1、Mental AI MentalAI(https://ai.ciyundata.com/)是一种基于文心大模型的知识增强大语言模型,专注于自然语言处理(NLP)领域的技术研发。它具备强大的语义理解和生成能力,能够处理各种复杂的自然语言任务。…

算法通关村第十九关:白银挑战-动态规划高频问题

白银挑战-动态规划高频问题 1. 最少硬币数 LeetCode 322 https://leetcode.cn/problems/coin-change/description/ 思路分析 尝试用回溯来实现 假如coins[2,5,7],amount27,求解过程中,每个位置都可以从[2,5,7]中选择,因此可以…

iwebsec靶场 文件包含漏洞通关笔记3-session文件包含

目录 1.打开靶场 2.源码分析 (1)session文件包含漏洞的的工作原理 (2)sessionstart()做了哪些初始化工作 3.获取session文件位置 4.向session写入webshell 5.访问webshell 1.打开靶场 iwebsec 靶场漏洞库iwebsechttp://iw…

【Blender】Blender入门学习

目录 0 参考视频教程0.1 Blender理论知识0.2 Blender上手实践0.3 FBX模型导入Unity 1 Blender的窗口介绍1.1 主界面1.2 模型编辑窗口 2 Blender的基本操作2.1 3D视图的平移2.2 3D视图的旋转2.3 3D视图的缩放2.4 修改快捷键2.5 使物体围绕选择的物体旋转2.6 四视图的查看2.7 局部…

遥遥领先的内存函数

目录 ​编辑 函数介绍 1.1 strlen 1.2 strcpy 1.3 strcmp 1.4 strcat 1.5 strstr 2.1 memcpy 2.2 memmove 2.3 memcmp 函数实现 1.1 strlen 1.2 strcpy 1.3 strcmp 1.4 strcat 1.5 strstr 2.1 memcpy 2.3 memcmp 函数介绍 1.1 strlen size_t strlen ( const char *…

猫头虎的技术笔记:Spring Boot启动报错解决方案

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

4.3.3 【MySQL】Redundant行格式

现在我们把表demo 的行格式修改为 Redundant : 为了方便大家理解和节省篇幅,我们直接把表 demo 在Redundant 行格式下的两条记录的真实存储数据提供出来,之后我们着重分析两种行格式的不同即可。 下边我们从各个方面看一下 Redundant 行格式有…

市场开始复苏,三星传调涨内存芯片高达20% | 百能云芯

随着行动内存芯片市场迹象显示出复苏迹象,并且最早在第四季度供不应求,三星电子已宣布将提高动态随机存取存储器(DRAM)和NAND闪存芯片的价格,幅度达到10%~20%。 韩国经济日报报道,知情人士透露,…

Day57|leetcode 647. 回文子串、516.最长回文子序列

leetcode 647. 回文子串 题目链接:647. 回文子串 - 力扣(LeetCode) 视频链接:动态规划,字符串性质决定了DP数组的定义 | LeetCode:647.回文子串_哔哩哔哩_bilibili 题目概述 给你一个字符串 s ,…