【设计模式】工厂模式

什么是工厂模式?

Java的工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,而是通过使用一个共同的接口来指向新创建的对象。这种类型的设计模式属于创建型模式,它提供了了一种创建对象的最佳方式。在Java中,工厂模式常常用于创建实例对象,例如通过一个工厂方法来创建对象,而不是直接使用new关键字。这样可以使代码更加灵活,易于扩展和修改。

为什么要有工厂模式?

很多人都会纠结于“既然都有了构造函数,何必再折腾那么多事情呢”。为了解答这个问题,先解释下构造函数是干什么用的。先用最早出现的C,创建资源差不多要这么干:some_struct * p =

(some_struct*)malloc(sizeof(some_struct)); init_some_struct§;
do_something§;

即先分配内存,再做类型转换,再初始化,然后使用。而在OOP的时代,创建一个对象是很频繁的事情。同时,一个没初始化的数据结构是无法使用的。因此,构造函数被发明出来,将分配内存+初始化合并到了一起。如C++的语法是:

SomeClz *p = new SomeClz(); do_something§; // or
p.do_something_else();

java也沿用了这个设计。但是,整个构造函数完成的工作从更高层的代码设计角度还是太过于初级。因此复杂的创建逻辑还是需要写代码来控制。所以还是需要:

SomeClz * createSomeClz(…) { // 做一些逻辑 SomeClz *p = new SomeClz();
// 或者复用已经有的对象 // 再做一些额外的初始化 return p; }

这就是Factory的雏形。
引用来自知乎,作者:大宽宽

工厂模式的三种形态

简单工厂模式(Simple Factory)
工厂方法模式(Factory Method)
抽象工厂模式(Abstract Factory)
这三种模式从上到下逐步抽象,并且更具一般性。《设计模式》一书中将工厂模式分为两类:工厂方法模式与抽象工厂模式。将简单工厂模式看为工厂方法模式的一种特例,两者归为一类。 我们先从以下案例对工厂模式做个初步的了解:

(1)在没有工厂的时代,如果客户需要一款宝马车,那么就需要客户去创建一款宝马车,然后拿来用。

(2)简单工厂模式:后来出现了工厂,用户不再需要去创建宝马车,由工厂进行创建,想要什么车,直接通过工厂创建就可以了。比如想要320i系列车,工厂就创建这个系列的车。

(3)工厂方法模式:为了满足客户,宝马车系列越来越多,如320i、523i等等系列,一个工厂无法创建所有的宝马系列,于是又单独分出来多个具体的工厂,每个具体工厂创建一种系列,即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象,你需要指定某个具体的工厂才能生产车出来。

(4)抽象工厂模式:随着客户要求越来越高,宝马车必须配置空调,于是这个工厂开始生产宝马车和需要的空调。最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车。
引用来自CSDN博主「张维鹏」的原创文章

具体实现

简单工厂模式

// 引入一个抽象类,声明其构造方法。
public abstract class SmartPhone {public SmartPhone(){}
}
// 引入HUAWEI类,集成手机类,并实现抽象方法
public class HUAWEI extends SmartPhone {public HUAWEI(){System.out.println("HUAWEI 666");}
}
// 引入IPHONE类,集成手机类,并实现抽象方法
public class IPHONE extends SmartPhone {public IPHONE(){System.out.println("IPHONE 666");}
}

这样,我们就有了两个类,都分别继承了手机类

// 创建工厂,PhoneFactory ,入参为1,创建实体华为。入参为2,创建实体苹果
public class PhoneFactory {public SmartPhone createPhone(int param){if(param == 1){return new HUAWEI();}if(param == 2){return new IPHONE();}else {return null;}}
}

运用工厂进行实例化:

public class AdminTest {public static void main(String[] args) {PhoneFactory phoneFactory = new PhoneFactory();SmartPhone phone = phoneFactory.createPhone(1);}
}

输出:
在这里插入图片描述

工厂方法模式

简单工厂模式的缺点就是,如果有很多个类都要继承手机类,那么工厂类的判断方法就会特别冗余。
所以我们有了工厂方法模式。

public  interface Factory {SmartPhone createSmartPhone();
}
public class HuaweiFactory implements Factory {@Overridepublic SmartPhone createSmartPhone() {return new HUAWEI();}
}
public class IphoneFactory implements Factory {@Overridepublic SmartPhone createSmartPhone() {return new IPHONE();}
}

运用:

public class AdminTest {public static void main(String[] args) {IphoneFactory iphoneFactory = new IphoneFactory();SmartPhone smartPhone = iphoneFactory.createSmartPhone();}
}

抽象工厂模式

我要创建很多,比如说生产电脑的同时,生产了显卡和cpu。
这时,我们引入抽象工厂模式的概念。
简单的讲,就是直接抽象工厂出来,而不是工厂生产的具体实例。

先创建三个接口,分别是电脑,显卡和cpu

public interface Computer {void makeGPU();void makeCPU();
}
public interface CPU {void makeCPU();
}
public interface GPU {void makeGPU();
}

显卡和cpu的实例

public class AMDCPU implements CPU {@Overridepublic void makeCPU() {System.out.println("AMD YYDS!");}
}
public class IntelCPU implements CPU {@Overridepublic void makeCPU() {System.out.println("INTEL 666!");}
}
public class AMDGPU implements GPU {@Overridepublic void makeGPU() {System.out.println("AMD的显卡世界第一!");}
}
public class IntelGPU implements GPU {@Overridepublic void makeGPU() {System.out.println("有钱人都买英特尔的显卡!");}
}

创建工厂类,分别实现amd或者Intel

public class AMDComputer implements Computer {@Overridepublic void makeGPU() {AMDGPU amdgpu = new AMDGPU();amdgpu.makeGPU();}@Overridepublic void makeCPU() {AMDCPU amdcpu = new AMDCPU();amdcpu.makeCPU();}
}
public class INTELComputer implements Computer {@Overridepublic void makeGPU() {IntelGPU intelGPU = new IntelGPU();intelGPU.makeGPU();}@Overridepublic void makeCPU() {IntelCPU intelGPU = new IntelCPU();intelGPU.makeCPU();}
}

通过抽象工厂创建电脑实例

public class AdminTest {public static void main(String[] args) {AMDComputer amdComputer = new AMDComputer();amdComputer.makeCPU();amdComputer.makeGPU();}
}

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

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

相关文章

【C#学习笔记】引用类型(1)

文章目录 引用类型class匿名类 记录引用相等和值相等record声明 接口delegate 委托合并委托/多路广播委托 引用类型 引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据。 对于引用类型,两种变量可引用同一对…

10.物联网操作系统之低功耗管理

一。低功耗管理概念及其应用 1.STM32低功耗设计详解 STM32的电源管理系统主要分为: 备份域 调压器供电电路 ADC电源电路 2.低功耗模式 1.运行模式 2.睡眠模式 3.停机模式 4.待机模式 (1)睡眠模式 在睡眠模式中,仅关闭了内核时钟&…

数据结构——二叉树

本章代码仓库:堆、二叉树链式结构 文章目录 🍭1. 树🧁1.1 树的概念🧁1.2 树的结构 🍬2. 二叉树🍫2.1 二叉树的概念🍫2.2 特殊的二叉树🍫2.3 二叉树的性质🍫2.4 二叉树的存…

Julia 日期和时间

Julia 通过 Dates 模块提供了以下三个函数来处理日期和时间: Date:表示日期,精确到日,只显示日期。DateTime:表示日期和时间,精确到毫秒。DateTime:表示日时间,精确到纳秒&#xff…

【数据库】将excel数据导入mysql数据库

环境:Windows10 mysql8以上 将你要导入的excel表另存为txt格式 打开txt格式文件,删除表头行并另存为并更改编码方式(由于与数据库的编码不同,会导致导入报错) 通过命令行登录数据库 winr cmd进入 进入装mysql的目录位…

基于BIM+AI的建筑能源优化模型【神经网络】

推荐:用 NSDT设计器 快速搭建可编程3D场景。 AEC(建筑、工程、施工)行业的BIM 技术,允许在实际施工开始之前虚拟地建造建筑物; 这带来了许多有形和无形的好处:减少成本超支、更有效的协调、增强决策权等等。…

Windows批处理基础

一、【echo】显示文本内容 echo | Microsoft Learnhttps://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/echo 显示消息或者打开或关闭命令回显功能。 如果不结合任何参数使用,echo 会显示当前回显设置。 1.1、echo显示文本常用命…

AIGC大模型ChatGLM2-6B:国产版chatgpt本地部署及体验

1 ChatGLM2-6B介绍 ChatGLM是清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人。ChatGLM基于GLM130B千亿基础模型训练,它具备多领域知识、代码能力、常识推理及运用能力;支持与用户通过自然语言对话进行交互,处理多种自然语言任务…

【SQL】-【计算两个varchar类型的timestamp的毫秒差】

背景 TRANSTAMP3、TRANSTAMP2在Oracle数据库中的类型为varchar,但实际保存的值是时间戳timestamp类型,现在要计算二者的毫秒差 Oracle或MySQL extract(second from (to_timestamp(TRANSTAMP3,yyyy-mm-dd hh24:mi:ss.ff) - to_timestamp(TRANSTAMP2,yyy…

运放电路之比较器的分析笔记

一、比较器 比较器分为同相比较器和反相比较器。 反相比较器电路如下: V11为固定值,这里设定的是2.5V,接到了运放的输入正(V); V10为输入值,值可变,接到了运放的输入负(V…

CADintosh X for mac CAD绘图软件2D CAD 程序 兼容 M1

CADintosh X for Mac是一个功能强大的2D CAD绘图程序,专为Mac用户设计。它由Lemke Software开发,提供了一套丰富的工具和功能,使用户能够轻松创建高质量的技术图纸,平面图和设计。 CADintosh X for Mac具有直观的用户界面&#x…

【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

物联网|按键实验---学习I/O的输入及中断的编程|函数说明的格式|如何使用CMSIS的延时|读取通过外部中断实现按键捕获代码的实现及分析-学习笔记(14)

文章目录 通过外部中断实现按键捕获代码的实现及分析Tip1:函数说明的格式Tip2:如何使用CMSIS的延时GetTick函数原型stm32f407_intr_handle.c解析中断处理函数:void EXTI4_IRQHandler 调试流程软件模拟调试 两种代码的比较课后作业: 通过外部中断实现按键捕获代码的实…

装修小程序,开启装修公司智能化服务的新时代

随着数字化时代的来临,装修小程序成为提升服务质量和效率的关键工具。装修小程序旨在为装修公司提供数字化赋能、提高客户满意度的智慧装修平台。通过装修小程序,装修公司能够与客户进行在线沟通、展示设计方案、提高服务满意度等操作。 装修小程序的好处…

8月5日上课内容 nginx的优化和防盗链

全部都是面试题 nginx的优化和防盗链 重点就是优化: 每一个点都是面试题,非常重要,都是面试题 1、隐藏版本号(重点,一定要会) 备份 cp nginx.conf nginx.conf.bak.2023.0805 方法一:修改配…

HTML 是什么?它的全称是什么?

聚沙成塔每天进步一点点 专栏简介HTML是什么?HTML的全称是什么?写在最后 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对We…

【大模型】开源且可商用的大模型通义千问-7B(Qwen-7B)来了

【大模型】开源且可商用的大模型通义千问-7B(Qwen-7B)来了 新闻通义千问 - 7B 介绍评测表现快速使用环境要求安装相关的依赖库推荐安装flash-attention来提高你的运行效率以及降低显存占用使用 Transformers 运行模型使用 ModelScope 运行模型 量化长文本…

2配置篇:基础功能配置

前言 在上一章节中,我们学习了 NestJS CLI 的用法,得到了一套基础的项目工程。最开始做项目对比的时候也提到过,NestJS 作为一款自定义程度较高的框架,CLI 直接提供的基础功能虽然并不完善,但同时也为开发者提供了非常多的内置或配套的功能例如高速缓存、日志拦截、过滤器…

阿里云平台WoSignSSL证书应用案例

沃通CA与阿里云达成合作并在阿里云平台上线WoSign品牌SSL证书。自上线以来,WoSignSSL证书成为阿里云“数字证书管理服务”热销证书产品,获得阿里云平台客户认可,助力阿里云平台政府、金融、教育、供应链、游戏等各类行业客户实现网站系统数据…

macOS下Django环境搭建

1. macOS升级pip /Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip 2. 卸载Python3.9.5版本 $ sudo rm -rf /usr/local/bin/python3 $ sudo rm -rf /usr/local/bin/pip3 $ sudo rm -rf /Library/Frameworks/Python.framework 3. 安装P…