设计模式之是简单工厂模式

分类

设计模式一般分为三大类:创建型模式、结构型模式、行为型模式。

  1. 创建型模式:用于创建对象,共五种,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  2. 结构型模式:用于处理类或对象的组合,共七种,包括适配器模式、装饰者模式、代理模式、门面模式、桥梁模式、组合模式、享元模式。
  3. 行为型模式:用于描述类或对象怎样交互以及怎样分配职责,共十一种,包括策略模式、模版方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

今天主角是简单工厂模式,是工厂模式的一种,属于创建型的设计模式。

定义

简单工厂模式是一种属于创建型模式的设计模式,又叫做静态工厂方法(Static Factory Method)模式。简单工厂模式的核心是一个工厂类,它负责实现创建所有产品实例的内部逻辑。这个工厂类提供了一个或多个静态的工厂方法,根据参数的不同返回不同类的实例。这些被创建的实例通常都具有共同的父类。

简单工厂模式

  • Factory(工厂角色)

工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。

  • Product(抽象产品角色)

抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。

  • ConcreateProduct(具体的产品类)

    具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法 。

示例

这里也使用女娲造人的传说来演示一下简单工厂模式的使用过程,这里女娲本身实际上就是一个造人的工厂,可以造男人、造女人。

UML类图如下

伪代码演示如下:

public interface Human {/*** 人类会吃东西*/void eat();/*** 人类会喝东西*/void drink();
}
public class Man implements Human{@Overridepublic void eat() {System.out.println("男人一般比较喜欢吃肉");}@Overridepublic void drink() {System.out.println("男人一般比较喜欢喝酒");}
}
public class Woman implements Human{@Overridepublic void eat() {System.out.println("女人一般都比较喜欢吃甜食");}@Overridepublic void drink() {System.out.println("女人一般都比较喝红酒");}
}
public class HumanFactory {public static Human create(Integer humanType){Human human=null;switch (humanType){case 0:human=new Woman();break;case 1:human=new Man();break;default:break;}return human;}public static void main(String[] args) {Human human = HumanFactory.create(1);human.eat();human.drink();Human woman = HumanFactory.create(0);woman.eat();woman.drink();}
}

到21世纪了,现代社会的“女娲”,如果除了会造正常的男人、女人外,还会造机器人,怎么办呢?使用简单工厂方法就很简单,

1、增加一个机器人类

2、再修改一下工厂类的造人方法;

Uml类图:

伪代码演示如下:

public class Robot implements Human{@Overridepublic void eat() {System.out.println("机器人不用吃东西");}@Overridepublic void drink() {System.out.println("机器人不用喝东西");}
}
public class HumanFactory {public static Human create(Integer humanType){Human human=null;switch (humanType){case 0:human=new Woman();break;case 1:human=new Man();break;case 2:human=new Robot();default:break;}return human;}public static void main(String[] args) {Human human = HumanFactory.create(1);human.eat();human.drink();Human woman = HumanFactory.create(0);woman.eat();woman.drink();Human robot = HumanFactory.create(2);robot.eat();robot.drink();}
}

应用场景

工厂模式是一种创建型模式,它允许你创建对象,而不必指定这些对象的类。这使得你可以在程序运行时动态地创建对象,如果一个类有多个子类,并且这些子类的创建过程比较复杂,那么使用工厂模式可以使得代码更加简洁,易于维护。

举一个例子,假设有一个订单支付功能,有两种支付方式:支付宝支付和微信支付。用户在客户端进行支付时,需要从这两种支付方式中选取一种,进行支付操作。在这种情况下,可以创建一个简单工厂模式来决定创建出哪一种支付方式的实例。

需要注意的是,虽然简单工厂模式在一定程度上降低了代码的复杂度,但在实际应用中,如果需要根据不同的条件创建不同的对象,或者需要在运行时动态地创建对象,或者需要对对象的创建过程进行复杂的控制,那么可能需要使用更复杂的工厂模式,例如工厂方法模式或者抽象工厂模式等。

总结

优点:

  • 易于扩展:由于简单工厂模式中工厂类的方法是静态的,所以可以在不修改原有代码的基础上增加新的产品类,只需要在新的产品类中实现工厂类所定义的接口即可。
  • 代码简洁:简单工厂模式将对象的创建和使用分离,使得代码更加清晰简洁,易于维护。
  • 单一职责:工厂类只负责创建对象,没有其他的职责,这使得代码更加单一,职责明确。

缺点:

  • 违反了“开闭原则”:在简单工厂模式中,如果要增加新的产品类,就需要修改工厂类,这违反了“开闭原则”。
  • 难以扩展:由于简单工厂模式中的工厂类是静态的,所以不能通过继承来实现多态。这使得该模式难以扩展到大型的应用中。
  • 依赖性强:由于简单工厂模式中的工厂类负责创建所有的产品对象,因此对产品类的实现有很强的依赖性。如果产品类的实现发生了改变,就需要修改工厂类。

建议

如果想要学会设计模式、用好设计模式,建议先从UML类图开始学,UML类图中不同的箭头和线条,代表的意义是不同的,这里简单的梳理了一下,如果需要可以移步这里:设计模式之基础:UML类图怎么看?_uml图怎么看-CSDN博客

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

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

相关文章

超火爆的6 个必学持续集成工具,测试人的福音

开发人员喜欢把写的代码当成自己的孩子,他们会被当成艺术品一样呵护。作为家长,总是会认为自己的孩子是最好的,也会尽全力给自己的孩子最好的,就算有时候会超出自己的能力范围。 最终,孩子会走出去,和其他…

android studio检测不到真机

我的情况是: 以前能检测到,有一天我使用无线调试,发现调试有问题,想改为USB调试,但是半天没反应,我就点了手机上的撤销USB调试授权,然后就G了。 解决办法: 我这个情况比较简单&…

Leetcode刷题笔记--Hot61-70

1--课程表(207) 主要思路: 用 in 记录每一门课程剩余的先修课程个数,当剩余先修课程个数为0时,将该课程加入到队列q中。 每修队列q中的课程,以该课程作为先修课程的所有课程,其剩余先修课程个数…

vue elementui的select组件实现滑到底部分页请求后端接口

vue elementui的select组件实现滑到底部分页请求后端接口 1.实现效果2.实现原理 1.实现效果 老规矩&#xff0c;直接上最后的实现效果 2.实现原理 直接上代码 <el-form-item class"diagmosisItem" label"诊断" v-scroll"handleScroll">…

✔ ★【备战实习(面经+项目+算法)】 10.15学习时间表

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

【微信小程序开发】基础语法篇

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于小程序的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.视图层 1.数据绑定 wxml js 2 .列…

Python学习六

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

AnolisOS升级SSH,不升级SSL

由于ssh有漏洞需要升级&#xff0c;但是为了最小化升级不影响ssl&#xff0c;因为ssl里面带了加密库&#xff0c;系统中很多核心服务的加密都是用ssl进行加密的&#xff08;像网络服务&#xff0c;系统用户登录等&#xff09;&#xff0c;如果ssl升级出现不兼容&#xff0c;就可…

Java实现B树

1.介绍 B树是一种自平衡的搜索树数据结构&#xff0c;常用于数据库和文件系统中的索引结构。它具有以下好处和功能&#xff1a; 高效的查找操作&#xff1a;B树的特点是每个节点可以存储多个关键字&#xff0c;并且保持有序。通过在节点上进行二分查找&#xff0c;可以快速定位…

260. 只出现一次的数字 III

给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&#xff1a; 输入&…

计算机基础知识32

Socket抽象层(socket编程) # Socket是在应用层和传输层之间的一个抽象层&#xff0c;它把TCP/IP层复杂的操作抽象为几个简单 的接口供应用层调用已实现进程在网络中通信 socket () 对象 bind () 函数来绑定 listen () 监听&#xff0c;等别人电话 accept&#xff08;&#…

AI电销机器人好不好用关键是什么?

影响AI电销机器人是否好用的两个因素分别是&#xff0c;识别系统以及线路。 有很多电销企业都想找一个好用的AI电销机器人&#xff0c;可是什么样的机器人才是好用的机器人呢?有哪些因素会影响AI电销机器人好不好用呢? 添加图片注释&#xff0c;不超过 140 字&#xff08;可选…

qt中json类

目录 QJsonValue QJsonObject QJsonArray QJsonDocument 案例&#xff1a; Qt 5.0开始提供了对Json的支持&#xff0c;我们可以直接使用Qt提供的Json类进行数据的组织和解析&#xff0c;下面介绍4个常用的类。 QJsonValue 该类封装了JSON支持的数据类型。 布尔类型&#xf…

【Power BI】Power BI 入门指南:版本、下载和报表创建的步骤

文章目录 一、前言二、了解 Power BI 版本三、下载 Power BI Desktop四、如何开始使用 Power BI Desktop五、在 Power BI Desktop 中创建报表六、文末总结 一、前言 Power BI 是微软于 2013 年推出的产品&#xff0c;为一款商业智能与数据可视化工具。它通过引人注目的视觉效果…

[Linux 基础] Linux编辑器Vim,你值得拥有

文章目录 1、Linux 软件包管理器 yum1.1 什么是软件包1.2 如何安装软件1.3 如何卸载软件 2、vim的使用2.1 vim的安装和配置2.2 vim的基本概念2.3 vim的基本操作 3、vim正常模式命令集4、vim注释与去注释5、Liunx编辑器-gcc/g使用5.1 如何使用gcc编译c程序5.2 gcc的翻译过程5.2.…

Python-pyecharts和pandas库

目录 pyecharts库 pandas库 示例1 示例2 pyecharts库 pyecharts是一个基于Python的交互式数据可视化库&#xff0c;旨在帮助用户轻松地创建各种类型的图表和可视化效果。该库是在Echarts开源项目的基础上开发的&#xff0c;Echarts是一款由百度开发的优秀的数据可视化工具。…

计算机网络基础(三):IPv4编址方式、子网划分、IPv4通信的建立与验证及ICMP协议

**IPv4地址是一个32位长的二进制数。**而这个32位二进制数又通常会表示为4个用点隔开的十进制数。那么&#xff0c;这个32位二进制数要如何通过4个十进制数表示出来呢&#xff1f; 我们在配置IPv4地址时&#xff0c;同时配置的“掩码”又有何用途&#xff1f; 1.IPv4编址方式…

第 367 场 LeetCode 周赛题解

A 找出满足差值条件的下标 I 模拟 class Solution { public:vector<int> findIndices(vector<int> &nums, int indexDifference, int valueDifference) {int n nums.size();for (int i 0; i < n; i)for (int j 0; j < i; j)if (i - j > indexDiffe…

软件测试的调用接口怎么调用,逻辑是什么?

一、什么是接口测试&#xff1f; 接口测试是测试系统组件之间接口的测试。接口主要用于检测外部系统和内部子系统之间的交互点。测试的重点是检查数据交换、传输、控制和管理过程&#xff0c;以及系统之间的相互逻辑依赖。 二、为什么要做接口测试&#xff1f; 在淘宝系统的历…

Go编程:使用 Colly 库下载Reddit网站的图像

概述 Reddit是一个社交新闻网站&#xff0c;用户可以发布各种主题的内容&#xff0c;包括图片。本文将介绍如何使用Go语言和Colly库编写一个简单的爬虫程序&#xff0c;从Reddit网站上下载指定主题的图片&#xff0c;并保存到本地文件夹中。为了避免被目标网站反爬&#xff0c…