设计模式—简单工厂

目录

一、前言

二、简单工厂模式

1、计算器例子

2、优化后版本

3、结合面向对象进行优化(封装)

3.1、Operation运算类

3.2、客户端

4、利用面向对象三大特性(继承和多态)

4.1、Operation类

4.2、加法类

4.3、减法类

4.4、乘法类

4.5、除法类

4.6、简单工厂

4.7、客户端

5、简单工厂模式优点

6、简单工厂模式缺点

三、总结


一、前言

简单工厂模式不属于GoF23种设计模式之一,但是实际中用途广泛,并且可以作为学习“工厂方法模式”以及“抽象工厂模式”的基础。在简单工厂模式中,工厂类提供一个创建产品的工厂方法,用于创建各种产品。客户端只需传入对应的参数,利用该方法即可根据传入参数的不同返回不同的具体产品对象。

二、简单工厂模式

简单工厂模式(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

因为在简单工厂模式用于创建实例的方法是静态的方法,因此简单工厂模式又被称为静态工厂方法模式,它属于类创建型模式。

在介绍简单工厂之前先来看一个简单的计算器小栗子。

1、计算器例子

public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入数字A:");String A = scanner.nextLine();System.out.println("请选择运算符号(+、-、*、/):");String B = scanner.nextLine();System.out.println("请输入数字B:");String C = scanner.nextLine();String D = "";if(B == "+"){D = String.valueOf(Double.parseDouble(A) + Double.parseDouble(C));}if(B == "-"){D = String.valueOf(Double.parseDouble(A) - Double.parseDouble(C));}if(B == "*"){D = String.valueOf(Double.parseDouble(A) * Double.parseDouble(C));}if(B == "/"){D = String.valueOf(Double.parseDouble(A) / Double.parseDouble(C));}System.out.println("运算结果:"+D);
}

 这段代码存在的问题:

  1. 这样命名是非常不规范的。像A、B、C、D这些,别人扎眼一看肯定不知道这是在做什么。
  2. 判断分支,这样的写法,意味着每个条件都要做判断,等于计算机做了三次无用功。
  3. 如果除数时,客户输入了0怎么办,如果用户输入的是字符符号而不是数字怎么办。

2、优化后版本

    public static void main(String[] args) {try {Scanner scanner = new Scanner(System.in);System.out.println("请输入数字A:");String numberA = scanner.nextLine();System.out.println("请选择运算符号(+、-、*、/):");String operate = scanner.nextLine();System.out.println("请输入数字B:");String numberB = scanner.nextLine();String result = "";switch (operate ){case "+":result = String.valueOf(Double.parseDouble(numberA) + Double.parseDouble(numberB));break;case "-":result = String.valueOf(Double.parseDouble(numberA) - Double.parseDouble(numberB));break;case "*":result = String.valueOf(Double.parseDouble(numberA) * Double.parseDouble(numberB));break;case"/":if (numberB != "0"){result = String.valueOf(Double.parseDouble(numberA) / Double.parseDouble(numberB));}else{result = "除数不能为0";}break;}System.out.println("运算结果:"+result);}catch (Exception e){System.out.println(e);}}

可以看到这一版中优化了变量的命名,将if判断更换成了switch case语句,增加了除数判断是否为0。

3、结合面向对象进行优化(封装)

3.1、Operation运算类

public class Operation {public static String getResult(double numberA, double numberB, String operate){String result = "";switch (operate){case "+":result = String.valueOf(numberA+ numberB);break;case "-":result = String.valueOf(numberA -numberB);break;case "*":result = String.valueOf(numberA * numberB);break;case"/":if (numberB != 0){result = String.valueOf(numberA / numberB);}else{result = "除数不能为0";}break;}return result;}
}

3.2、客户端

public class Program {public static void main(String[] args) {try {Scanner scanner = new Scanner(System.in);System.out.println("请输入数字A:");String numberA = scanner.nextLine();System.out.println("请选择运算符号(+、-、*、/):");String operate = scanner.nextLine();System.out.println("请输入数字B:");String numberB = scanner.nextLine();String result = "";Operation.getResult(Double.parseDouble(numberA), Double.parseDouble(numberB),operate);System.out.println("运算结果:"+result);}catch (Exception e){System.out.println(e);}}
}

4、利用面向对象三大特性(继承和多态)

4.1、Operation类

public abstract class Operation {private double numberA;private double numberB;public double getNumberA() {return numberA;}public void setNumberA(double numberA) {this.numberA = numberA;}public double getNumberB() {return numberB;}public void setNumberB(double numberB) {this.numberB = numberB;}public abstract double getResult() throws Exception;
}

4.2、加法类

public class OperationAdd extends Operation{@Overridepublic double getResult() {return getNumberA()+getNumberB();}
}

4.3、减法类

public class OperationSub extends Operation{@Overridepublic double getResult() {return getNumberB() - getNumberB();}
}

4.4、乘法类

public class OperationMul extends Operation{@Overridepublic double getResult() {return getNumberA() * getNumberB();}
}

4.5、除法类

public class OperationDiv extends Operation{@Overridepublic double getResult() throws Exception {if (getNumberB() != 0){return getNumberA() / getNumberB();}throw new Exception("除数不能为0");}
}

4.6、简单工厂

public class OperationFactory {public static Operation createOperate(String operate){Operation operation = null;switch (operate){case "+":operation = new OperationAdd();break;case "-":operation = new OperationSub();break;case "*":operation = new OperationMul();break;case"/":operation = new OperationDiv();break;}return operation;}
}

4.7、客户端

public class Program {public static void main(String[] args) throws Exception {Operation operation;operation = OperationFactory.createOperate("+");operation.setNumberA(2);operation.setNumberB(4);double result = operation.getResult();System.out.println(result);}
}

5、简单工厂模式优点

1、工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅“消费”产品;简单工厂模式通过这种做法实现了对责任的分割,它提供了专门的工厂类用于创建对象。

2、客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。

3、通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

6、简单工厂模式缺点

1、由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

2、使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。

3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。

4、简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

三、总结

使用了简单工厂之后,如果有一天我们需要更改假发运算,只需要更改OperationAdd就可以了,如果需要增加各种复杂运算,例如:平方根、自然对数、正弦等,需要增加相应的运算子类,修改运算类工厂,在switch中增加分支,来看一下简单工厂的类结构。

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

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

相关文章

计算机竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的人脸专注度…

安卓Termux搭建web服务器【公网远程手机Android服务器】

文章目录 概述1.搭建apache2.安装cpolar内网穿透3.公网访问配置4.固定公网地址5.添加站点 概述 Termux是一个Android终端仿真应用程序,用于在 Android 手机上搭建一个完整的Linux 环境,能够实现Linux下的许多基本操作,不需要root权限Termux就…

网易低代码引擎Tango正式开源

一、Tango简介 Tango 是一个用于快速构建低代码平台的低代码设计器框架,借助 Tango 只需要数行代码就可以完成一个基本的低代码平台前端系统的搭建。Tango 低代码设计器直接读取前端项目的源代码,并以源代码为中心,执行和渲染前端视图,并为用户提供低代码可视化搭建能力,…

[ROS]yolov5-7.0部署ROS

YOLOv5是一种目标检测算法,它是YOLO(You Only Look Once)系列算法的最新版本。与其它目标检测算法相比,YOLOv5在速度和准确性方面取得了显著的提升。在ROS(Robot Operating System)中使用Python部署YOLOv5可…

【100天精通Python】Day51:Python 数据分析_数据分析入门基础与Anaconda 环境搭建

目录 1 科学计算和数据分析概述 2. 数据收集和准备 2.1 数据收集 2.1.1 文件导入: 2.1.2 数据库连接: 2.1.3 API请求: 2.1.4 网络爬虫: 2.2 数据清洗 2.2.1 处理缺失值: 2.2.2 去除重复值: 2.2…

SSH连接安卓手机Termux —— Android手机

文章目录 前言1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 前言 使用安卓机跑东西的时候,屏幕太小,有时候操作不习惯。不过我们可以开启ssh,使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在…

【图像分割】实战篇(1)传统图像分割

聚类图像分割 K均值聚类是一种常用的聚类算法,它将图像像素分为K个不同的群集,以使每个群集内的像素具有相似的颜色或强度。这可以用于分割具有不同颜色或亮度的对象。 import numpy as np import matplotlib.pyplot as plt from sklearn.cluster impo…

QT listWidget 中实现元素的自由拖拽

QListWIdget中拖拽元素移动 setMovement(QListView::Movement::Free);setDragEnabled(true); setDragDropMode(DragDropMode::DragDrop); setDefaultDropAction(Qt::DropAction::MoveAction);

Flutter小功能实现-咖啡店

1 导航栏实现 效果图: 1.Package google_nav_bar: ^5.0.6 使用文档: google_nav_bar | Flutter Package 2.Code //MyBottomNavBar class MyBottomNavBar extends StatelessWidget {void Function(int)? onTabChange;MyBottomNavBar({super.key, …

2023年高教社杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…

任意文件读取和漏洞复现

任意文件读取 1. 概述 一些网站的需求,可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过,就可以查看或下载任意文件。这些文件可以是漂代码文件,配置文件,敏感文件等等。 任意文件读取会造成&…

transformer源码

1.传统RNN网络 每一层都需要上一层执行完才能执行 1.1 自注意力 在一句话中找到it_指代的是什么,它的上下文语境是什么? self-attetion计算 1.2 multi-header机制 1.3 堆叠多层self-attention,相当于再一次卷积 1.4 位置信息编码 1.5 残…