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

设计模式系列:简单工厂模式

作者持续关注 WPS二次开发专题系列,持续为大家带来更多有价值的WPS二次开发技术细节,如果能够帮助到您,请帮忙来个一键三连,更多问题请联系我(QQ:250325397)

目录

定义

特点

使用场景

优缺点

(1) 优点

(2) 缺点

模式结构

具体实现

实际应用


定义

简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

特点

在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。

使用场景

在以下情况下可以使用简单工厂模式:

工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

举例:

一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、椭圆按钮等), 这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。

优缺点

(1) 优点
    • 通过使用工厂类,外界不再需要关心如何创造各种具体的产品,只要提供一个产品的名称作为参数传给工厂,就可以直接得到一个想要的产品对象,并且可以按照接口规范来调用产品对象的所有功能(方法)。
    • 构造容易,逻辑简单。
(2) 缺点
    • 简单工厂模式中的if else判断非常多,完全是Hard Code,如果有一个新产品要加进来,就要同时添加一个新产品类,并且必须修改工厂类,再加入一个 else if 分支才可以, 这样就违背了 “开放-关闭原则”中的对修改关闭的准则了。当系统中的具体产品类不断增多时候,就要不断的修改工厂类,对系统的维护和扩展不利。
    • 一个工厂类中集合了所有的类的实例创建逻辑,违反了高内聚的责任分配原则,将全部的创建逻辑都集中到了一个工厂类当中,所有的业务逻辑都在这个工厂类中实现。什么时候它不能工作了,整个系统都会受到影响。因此一般只在很简单的情况下应用,比如当工厂类负责创建的对象比较少时。
    • c简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

模式结构

简单工厂模式包含如下角色:

  • Factory:工厂角色

工厂角色负责实现创建所有实例的内部逻辑

  • Clickable:抽象产品角色

抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口

  • CircleButton:具体产品角色

具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。

具体实现

/*** 产品接口--抽象按钮*/
public interface Clickable {/*** 响应按钮点击*/void onClick();
}/*** 具体产品--圆形按钮*/
public class CircleButton implements Clickable {@Overridepublic void onClick() {System.out.println("button click: CircleButton...");}
}
/*** 工程模式--简单工厂*/
public class SimpleFactory {/*** 创建按钮* @param type 按钮类型,1:圆形按钮;2:椭圆形按钮;3:矩形按钮,默认:矩形按钮,可用常量或者枚举代替* @return 具体按钮*/public static Clickable createButton(int type) {Clickable button = null;switch (type) {case 1: //圆形按钮button = new CircleButton();break;case 2: //椭圆形按钮button = new OvalButton();break;case 3: //矩形按钮button = new RectangleButton();break;default:    //矩形按钮break;}return button;}
}

具体使用

public class App {public static void main(String[] args) {//1:圆形按钮Clickable circleButton = SimpleFactory.createButton(1);circleButton.onClick();//2:椭圆形按钮Clickable ovalButton = SimpleFactory.createButton(2);ovalButton.onClick();//3:矩形按钮Clickable rectangleButton = SimpleFactory.createButton(3);rectangleButton.onClick();}
}

实际应用

① JDK类库中广泛使用了简单工厂模式,如工具类java.text.DateFormat,它用于格式化一个本地日期或者时间。

public final static DateFormat getDateInstance();
public final static DateFormat getDateInstance(int style);
public final static DateFormat getDateInstance(int style,Locale locale);

②Java加密技术

获取不同加密算法的密钥生成器:

KeyGenerator keyGen=KeyGenerator.getInstance("DESede");

创建密码器:

Cipher cp=Cipher.getInstance("DESede");
http://www.lryc.cn/news/339930.html

相关文章:

  • 解决 windows+Ubuntu 时间不同步问题
  • Learn SRP 01
  • NL2SQL进阶系列(4):ConvAI、DIN-SQL、C3-浙大、DAIL-SQL-阿里等16个业界开源应用实践详解[Text2SQL]
  • Python统计分析库之statsmodels使用详解
  • A Learning-Based Approach for IP Geolocation(2010年)
  • 高创新 | [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测
  • Web APP设计:将多个相近的机器学习模型融合到一个Web APP中
  • 网络爬虫:定义、应用及法律道德考量
  • (三)ffmpeg 解码流程以及函数介绍
  • go work模块与go mod包管理是的注意事项
  • 华为OD-C卷-最长子字符串的长度(一)[100分]
  • 实战小项目 | ESP32-S3和ESP32-C3通过ESP-Mesh-Lite组网 温湿度传感器案例
  • SiLM5350系列带米勒钳位的单通道隔离驱动器 助力汽车与工业应用实现稳定与高效的解决方案
  • c#中怎么自动下载软件
  • Unity笔记之下拉刷新列表
  • 防火墙操作!
  • 代码随想录算法训练营第四十一天| 343. 整数拆分,96.不同的二叉搜索树
  • 【MATLAB源码-第53期】m代码基于粒子群算法(PSO)的三维路径规划,显示最优路径和适应度曲线。
  • el-table多行合并
  • Vue3 + Element-Plus 使用 Table 插槽时数据未及时更新
  • vue 2 怎么把2024-04-13T17:42:19转换成短日期格式
  • 网络IO模型以及实际应用
  • 一文详解MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系
  • 《Kubernetes部署篇:基于Kylin V10+ARM架构CPU使用containerd部署K8S 1.26.15集群(一主多从)》
  • maven命令
  • jetson系列开发板使用虚拟机烧录系统时,遇见无法识别开发板的情况
  • 【数据结构】树与二叉树、树与森林部分习题以及算法设计例题 2
  • Cesium之home键开关及相机位置设置
  • FreeRTOS_day1
  • Nginx日志格式化和追踪