详解设计模式:简单工厂模式

news/2024/5/16 15:19:52/文章来源:https://blog.csdn.net/weixin_45187434/article/details/128043083

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

本篇内容包括:工厂模式 概述、关于 简单工厂模式、简单工厂模式 Demo。


文章目录

    • 一、工厂模式 概述
        • 1、工厂模式的使用场景
        • 2、工厂模式的分类
    • 二、关于 简单工厂模式
        • 1、关于 简单工厂模式
        • 2、关于 简单工厂模式的构成
        • 3、关于 简单工厂模式的实现
        • 4、关于 简单工厂模式的优缺点
    • 三、简单工厂模式 Demo
        • 1、Demo 设计
        • 2、Demo 实现
        • 3、Demo 测试


一、工厂模式 概述

工厂方法是一种十分常用的创建型设计模式,它在父类中提供了创建对象的接口但允许子类更改将要创建的对象的类型。

1、工厂模式的使用场景

在一些情况下,要创建的对象需要一系列复杂的初始化操作,比如查配置文件、查数据库表、初始化成员对象等,如果把这些逻辑放在构造函数中,会极大影响代码的可读性。不妨定义一个类来专门负责对象的创建,这样的类就是工厂类,这种做法就是工厂模式,在任何需要生成复杂对象的地方,都可以使用工厂模式。

2、工厂模式的分类

一般情况下,我们所提及的“工厂模式”会被细分为三种,即简单工厂、工厂方法和抽象工厂。而 GoF 的《设计模式》一书中,它将简单工厂模式看作是工厂方法模式的一种特例,所以工厂模式只被分成了工厂方法和抽象工厂两类。


二、关于 简单工厂模式

1、关于 简单工厂模式

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

简单工厂模式将产品的“消费”和“生产”完全分开,调用房,只需要自己需要什么产品,和如何使用就可以了,而对于产品的具体生产任务,则由工厂类来实现。

工厂类根据传进来的参数生产具体的产品供消费者使用。这种模式使得更加利于扩展,当有新的产品加入时仅仅需要在工厂中加入新产品的构造就可以了。

2、关于 简单工厂模式的构成

简单工厂的构成:

  • 具体的工厂角色(Factory):工厂角色即工厂类,他是简单工厂模式的核心,负责创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需要的产品对象;在工厂类中提供进后台的工厂方法 factoryMethod(),它返回的产品类型为抽象的产品类型 Product。
  • 抽象的产品角色(Product):它是工厂类创建的所有对象的父类,封装了各种产品对象的公有方法,它的引入提高了系统的灵活性,使得在工厂类中只需要定义一个通用的工厂方法,因为所有创建的具体产品都是其子类对象。
  • 具体的产品角色(ConcreteProduct):简单工厂的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都集成了抽象产品角色,需要在实现在抽象产品中声明的抽象方法。

3、关于 简单工厂模式的实现

首先,根据具体产品进行抽象,将它们的公共的代码进行抽象和提取后,封装在一个抽象产品中;

其次,根据抽象产品,将各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,每一个具体产品都是抽象产品的子类;

然后,提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据传入的参数不同创建不同的具体产品对象;

最后,客户端只需要调用工厂类的工厂方法并传入响应的参数即可得到一个具体产品对象。

4、关于 简单工厂模式的优缺点

优点:客户端与产品的创建分离,客户端不需要知道产品创建的逻辑,只需要消费该产品即可。

缺点:工厂类集成了所有产品的创建逻辑,当工厂类出现问题,所有产品都会出现问题;还有当新增加产品都会修改工厂类,违背开闭原则


三、简单工厂模式 Demo

1、Demo 设计

# 角色

DemoFactory、DemoAbstractProduct、DemoProductA、DemoProductB

在这里插入图片描述

# 实现

DemoAbstractProduct 是作为产品角色的抽象父类,DemoProductA、DemoProductB 是作为产品角色的具体实现的子类。

DemoFactory 作为具体工厂角色,通过方法 factoryMethod(String productName) 根据 productName 返回对应的工厂。

2、Demo 实现

# DemoAbstractProduct 抽象产品类

//抽象产品类
public abstract class DemoAbstractProduct {//抽象产品方法public abstract sayHi();
}

# DemoProductA 具体产品类A

//继承抽象类实现产品A类
public class DemoProductA extends DemoAbstractProduct {//实现抽象产品方法@Overidepublic abstract sayHi(){System.out.println("Hi, I'm ProductA");}
}

# DemoProductB 具体产品类B

//继承抽象类实现产品B类
public class DemoProductB extends DemoAbstractProduct {//实现抽象产品方法@Overidepublic abstract sayHi(){System.out.println("Hi, I'm ProductB");}
}

# DemoFactory 产品工厂类

public class DemoFactory {public DemoFactory() {}//第一种写法//根据产品名称生产产品public DemoAbstractProduct factoryMethod(String productName) {DemoAbstractProduct product = NULL;switch(productName){case "A":product = new DemoProductA();//生产产品Abreak;case "B":product = new DemoProductB();//生产产品Bbreak;default:break;}return product;}
}

3、Demo 测试

public class Client {public static void main(String[] args) {DemoAbstractProduct product;//通过工厂类创建具体产品对象product = DemoFactory.factoryMethod("A");product.sayHi();}
}

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

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

相关文章

SpringBoot整合Mybatis方式2:使用注解方式整合Mybatis

SpringBoot整合Mybatis简介SpringBoot整合Mybatis方式2:使用注解方式整合Mybatis1.先用idea创建一个添加mybatis需要的相关依赖的工程。2.准备数据库和表3.创建表映射类4.创建mapper代理接口5.创建Service层和Service的实现层6.创建控制层(也就是web层&a…

五种方法帮你解决电脑内存占用大的问题

有用户反映自己的电脑什么都没开,但是运行内存显示占用90%以上,这是什么情况?运行内存占用大,直接影响了用户的使用体验,下面小编就给大家分享五个解决电脑内存占用大的办法吧。 方法一: 1、右键【我的电脑…

Spring Boot Admin2 自定义异常监控

其他相关文章: Spring Boot Admin 参考指南SpringBoot Admin服务离线、不显示健康信息的问题Spring Boot Admin2 EnableAdminServer的加载Spring Boot Admin2 AdminServerAutoConfiguration详解Spring Boot Admin2 实例状态监控详解Spring Boot Admin2 自定义JVM监控…

GEO振弦式钢筋计的组装

(1)按钢筋直径选配相应的钢筋计,如果规格不符合,应选择尽量接近于结构钢筋直径 的钢筋计,例如:钢筋直径为 35mm,可使用 NZR-36 或 NZR-32 的钢筋计,此时仪器的最小 读数应进行修…

MapReduce

4.1 MapReduce概述 2003年和2004年,Google公司在国际会议上分别发表了两篇关于Google分布式文件系统和MapReduce的论文,公布了Google的GFS和MapReduce的基本原理和主要设计思想。 4.1.1 MapReduce定义 MapReduce是一个分布式运算程序的编程框架&#…

【无百度智能云与实体经济“双向奔赴”: 一场1+1>2的双赢 标题】

实体经济,已经成为检验科技企业潜力的试金石。 在最近的财报季中,各家大厂的财报里“实体经济”都是关键字眼,已经成为各家心照不宣的共同目的地。 当然,条条大路通罗马。每一家的战略思路和打法都不一样。11月22日,…

DOTA-PEG-麦芽糖 maltose-DOTA 麦芽糖-四氮杂环十二烷四乙酸

DOTA-PEG-麦芽糖 maltose-DOTA 麦芽糖-四氮杂环十二烷四乙酸 PEG接枝修饰麦芽糖,麦芽糖-聚乙二醇-四氮杂环十二烷四乙酸,DOTA-PEG-麦芽糖 中文名称:麦芽糖-四氮杂环十二烷四乙酸 英文名称:maltose-DOTA 别称:DOTA修…

HCIA 访问控制列表ACL

一、前言 ACL又称访问控制列表,其实这个东西在很多地方都有用,可能名字不太一样但原理和功能都差不太多,比如服务器、防火墙,都有类似的东西,功能其实也就是“过滤”掉不想收到的数据包。为什么不想收到一些数据包呢&…

The Seven Tools of Causal Inference with Reflections on Machine Learning 文章解读

目录 THE THREE LAYER CAUSAL HIERARCHY. 4 THE SEVEN TOOLS OF CAUSAL INFERENCE (OR WHAT YOU CAN DO WITH A CAUSAL MODEL THAT YOU COULD NOT DO WITHOUT?) 7 Tool 1: Encoding Causal Assumptions – Transparency and Testability. 10 Tool 2: Do-calculus and the …

深入浅出基于HLS流媒体协议视频加密的解决方案

一套简单的基于HLS流媒体协议,使用video.js NodeJS FFmpeg等相关技术实现的m3u8tsaes128视频加密及播放的解决方案示例。 项目简介 起初是为了将工作中已有的基于Flash的视频播放器替换为不依赖Flash的HTML5视频播放器,主要使用了现有的video.js开源播…

【学习笔记25】JavaScript字符串的基本认识

JavaScript字符串的基本认识一、严格模式二、字符串1、字面量2、构造函数3、包装类型三、字符集(了解)1、ASCII:128个2、GBK国标码:前128位ASCII,从129开始为汉字3、unicode(万国码)四、字符串的length与下标一、严格模…

学弟:功能测试转测试开发容易吗?

最近看到后台留言问:功能测试转测试开发容易吗? 从这个问题,我能读出一些信息如下: 不知道你从事测试工作多久了,可以看出您特别羡慕测试开发工程师;你可能一直从事功能测试工作,工作模式或大…

排名预测系统

排名预测系统 题目链接 题目背景: 本题大模拟来自真实的需求,即:综合三场网络赛的名次,来预计一个正式队伍在所有正式参赛队伍中的名次以此来估计自己能不能拿牌。本来只有一道题,即为你们看到的T5,经过…

HTTP响应详解

目录 一.状态码 小结(记住) 二.认识响应正文(body) 三.如何构造http请求 一.状态码 是一个数字,这个数字描述了当前这次请求的状态(成功,失败,失败的原因) http的状态…

logcat日志文件分析

3:显示时间戳日志 adb logcat -v time > d:\文件\log.txt 日志文件分析 输出的日志格式由5部分组成 1:写下日志的时间 2:优先级,日志优先级从低到高分以下几种 v -verbose 最低级别,开发调试中的一些详细信息,仅在开发中使用&#…

以分割栅格为例实现FME模板的方案优化

一、利用FME分割栅格 (一)问题的产生 对于FME使用者来说,利用FME完成栅格的批量分割是一件极为平常且容易的事情。只需要输入栅格和确定分割方案就可以实现利用FME对栅格数据的分割,再配合FME的“扇出”功能,就能够实…

【colab安装mmcv-full和mmclassification】

colab安装mmcv-full和mmclassification改变cuda和pytorch版本查看torch版本安装mmcv-full安装mmclassification克隆并安装mmcls切换到目录源码安装检查mmcls版本改变cuda和pytorch版本 !pip --default-timeout1000 install torch1.9.0cu111 -f https://download.pytorch.org/w…

常用辅助类

CountDownLatch 应用场景:1.多线程任务汇总。2.多线程任务阻塞住,等待发令枪响,一起执行。 减法计数器 每次有线程调用,数量-1,当计数器归零,countDownLatch.await()就会被唤醒向下执行。 import java.uti…

c语言tips-带参main函数

0.写在最前 最近因为工作需要开始重新学c语言,越学越发现c语言深不可测,当初用python轻轻松松处理的一些数据,但是c语言写起来却异常的复杂,这个板块就记录一下我的c语言复习之路 1. main函数的两种表现形式 main函数是c/cpp语言的…

Docker学习(5)—— 在Docker上安装软件

一. 安装Tomcat 1. 下载最新版 (1) 拉取Tomcat镜像 docker pull tomcat (2) 查看是否拉取到Tomcat镜像 docker images tomcat (3) 创建Tomcat容器并启动 docker run -d -p 8080:8080 tomcat 这时访问tomcat首页报404错误,有以下两个原因:①防火…