当前位置: 首页 > news >正文

4、设计模式之工厂模式

文章目录

  • 开始之前
  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式
  • 总结

开始之前

本章节是一个系列,里面用的的代码实例都是连贯的。在实现某一种设计模式时,为了减少代码篇幅,前面博客出现model类(仅限公用的model类,比如compute、CPU、Mem、Disk等纯对象类)不会重复出现,读者在阅读某一篇博客时,如果发现突然出现了一个新的model类,在本片博客中没有其定义,可以往前面的博客翻一下!

最后,当本系列更新完成后,我会整个的代码完整贴出来,提供下载链接!

简单工厂模式

效果:用户不必关心对象怎么生产的,甚至不用关心这个具体对象是什么。
工厂的生产规则可以写入配置文件,这样修改时就不需要动代码了。

  • 缺点:如果我们想让工厂再能多生产一种东西,那就要修改这个工厂类的方法。这显然不符合开闭原则。
public class HUAWEICompute extends Compute{@Overrideprotected String getName() {return "huawei compute";}
}
public class MacCompute extends Compute{@Overrideprotected String getName() {return "mac compute";}
}
/*** 简单工厂模式* 有一个缺点:如果我们想让工厂再能多生产一种东西,那就要修改这个工厂类的方法。这显然不符合开闭原则*/
public class SimpleFactory {/**第一种实现方式
*/public static Compute createCompute(String type){switch (type){case "HUAWEI":return new HUAWEICompute();case "MAC":return new MacCompute();case "XIAOMI":return new XiaomiCompute();default:return null;}}
/**第二种实现方式
*/public static Compute createCompute(Class<? extends Compute> clzss){try {return clzss.newInstance();}catch (Exception e){e.printStackTrace();}return null;}
}

工厂方法模式

在简单工厂中,有一个缺点:如果我们想让工厂再能多生产一种东西,那就要修改这个工厂类的方法。这显然不符合开闭原则。
针对这个问题,所以引出了工厂方法模式。
在简单工厂模式中,不管生产什么品牌的鞋子,都用同一工厂。
而在工厂方法模式中,想要生产某一个品牌的鞋子,就使用其对应的工厂。
也就是说一个工厂只生产一种产品

  • 缺点:一个工厂只能生产一种产品,子类越来越多,系统中类的个数也会成倍增加。增加代码复杂度
public interface ComputeFactory {Compute createCompute();
}public class HuaweiComputeFactory implements ComputeFactory{@Overridepublic Compute createCompute() {return new HUAWEICompute();}
}public class XiaomiComputeFactory implements ComputeFactory{@Overridepublic Compute createCompute() {return new XiaomiCompute();}
}

抽象工厂模式

在工厂方法模式中,

  • 优点:增加分组非常简单,例如要增加Lenovo分组,只需创建Lenovo工厂和具体的产品实现类。
  • 缺点:分组中的产品扩展非常困难,要增加一个鼠标Mouse,既要创建抽象的Mouse接口, 又要增加具体的实现:DellMouse、HPMouse, 还要再每个Factory中定义创建鼠标的方法实现。
public class HUAWEIDisk extends Disk{@Overrideprotected String getName() {return "huawei disk";}
}
public class HUAWEICpu extends CPU{@Overrideprotected String getName() {return "huawei cpu";}
}
public class HUAWEIMem extends Mem{@Overrideprotected String getName() {return "huawei mem";}
}
public interface Factory {Compute createCompute();CPU createCpu();Mem createMem();Disk createDisk();
}public class HuaweiFactory implements Factory{@Overridepublic Compute createCompute() {return new HUAWEICompute();}@Overridepublic CPU createCpu() {return new HUAWEICpu();}@Overridepublic Mem createMem() {return new HUAWEIMem();}@Overridepublic Disk createDisk() {return new HUAWEIDisk();}
}public class XiaomiFactory implements Factory{@Overridepublic Compute createCompute() {return new XiaomiCompute();}@Overridepublic CPU createCpu() {return new XiaomiCpu();}@Overridepublic Mem createMem() {return new XiaomiMem();}@Overridepublic Disk createDisk() {return new XiaomiDisk();}
}

总结

  • 简单工厂:唯一工厂类,一个产品抽象类,工厂类的创建方法依据入参判断并创建具体产品对象。
  • 工厂方法:多个工厂类,一个产品抽象类,利用多态创建不同的产品对象,避免了大量的if-else判断。
  • 抽象工厂:多个工厂类,多个产品抽象类,产品子类分组,同一个工厂实现类创建同组中的不同产品,减少了工厂子类的数量。

相关文章:

  • C语言常用的内存操作函数
  • 打豆豆game
  • 带你玩转OpenHarmony AI:打造智能语音子系统
  • SpringBoot基础详解
  • 指针变量加1为什么地址加了4?
  • Python01:初入Python(Mac)
  • 【计算机视觉(3)】
  • Docker 安装最新版MongoDB 限制内存 配置权限
  • 电影《朝云暮雨》观后感
  • SW 草图明显显示
  • C++---运算符重载
  • VUE3好看的酒网站模板源码
  • [猫头虎分享21天微信小程序基础入门教程]第13天:小程序的表单与用户输入处理
  • 9.6 Go语言入门(数组、切片和指针)
  • 深度学习之基于YOLOV5安全帽检测系统
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 11111111
  • Fabric架构演变之路
  • IOS评论框不贴底(ios12新bug)
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Javascript编码规范
  • Java小白进阶笔记(3)-初级面向对象
  • ucore操作系统实验笔记 - 重新理解中断
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 微信小程序--------语音识别(前端自己也能玩)
  • 我与Jetbrains的这些年
  • 移动端唤起键盘时取消position:fixed定位
  • 自定义函数
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 容器镜像
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • (6)STL算法之转换
  • (k8s)kubernetes 部署Promehteus学习之路
  • (windows2012共享文件夹和防火墙设置
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)可以带来幸福的一本书
  • ***监测系统的构建(chkrootkit )
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net的C#语言取月份数值对应的MonthName值
  • .Net的DataSet直接与SQL2005交互
  • .net连接MySQL的方法
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .NET使用存储过程实现对数据库的增删改查
  • .NET中 MVC 工厂模式浅析
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析