设计模式从入门到精通之(一)工厂模式

news/2024/12/12 11:36:07/

工厂模式:为每个工厂找到"生意经"

在现实生活中,我们随处可见"工厂"的影子,比如汽车工厂生产汽车,食品工厂生产食品。但你有没有想过,为什么我们需要工厂?如果没有工厂,我们自己能不能搞定这些生产?今天,我们就用现实中的例子来引入软件设计中的工厂模式

1. 什么是工厂模式?

工厂模式(Factory Pattern)是一种创建型设计模式,它通过为对象的创建提供一种统一的接口,来隐藏实例化的具体逻辑。简单来说,工厂模式就像一台机器,它为你定制化地生产出想要的东西,而不需要你自己动手去捣鼓具体的制作过程。

在代码世界里,工厂模式能够帮助我们解决"简单对象创建"变成"复杂耦合代码"的问题,减少维护难度。

2. 用现实中的故事引出工厂模式

假设你是一名咖啡爱好者,每天早晨都需要喝一杯咖啡来提神。家里有各种原材料,比如咖啡豆、牛奶、糖等等。但是如果让你每天一大早起来,自己磨豆、煮咖啡、打奶泡,是不是感觉太麻烦?如果有一家咖啡店帮你制作出各种类型的咖啡,比如美式、拿铁、卡布奇诺,你只需要说出你想喝的咖啡名称就行,岂不是省时省力?

这家咖啡店就是一个工厂,它屏蔽了制作过程的复杂性,让你通过简单的请求(咖啡名称),得到想要的结果(咖啡)。

3. 工厂模式的代码实现

我们用代码来模拟这个场景,看看如何用工厂模式来制作咖啡。

3.1 咖啡类

每种咖啡都有自己的特点,我们用不同的类来表示。

java">// 定义咖啡的抽象类
abstract class Coffee {public abstract String getName();public void prepare() {System.out.println("Preparing ingredients for " + getName());}
}// 美式咖啡
class AmericanCoffee extends Coffee {@Overridepublic String getName() {return "American Coffee";}
}// 拿铁咖啡
class LatteCoffee extends Coffee {@Overridepublic String getName() {return "Latte Coffee";}
}

3.2 咖啡工厂

为了屏蔽咖啡的具体制作细节,我们创建一个咖啡工厂。

java">class CoffeeFactory {public static Coffee createCoffee(String type) {if ("American".equalsIgnoreCase(type)) {return new AmericanCoffee();} else if ("Latte".equalsIgnoreCase(type)) {return new LatteCoffee();} else {throw new IllegalArgumentException("Unknown coffee type: " + type);}}
}

3.3 客户端代码

客户端只需要和工厂交互,就可以获取不同种类的咖啡,而不用关心咖啡是怎么制作的。

java">public class CoffeeShop {public static void main(String[] args) {Coffee american = CoffeeFactory.createCoffee("American");american.prepare();Coffee latte = CoffeeFactory.createCoffee("Latte");latte.prepare();}
}

运行结果:

Preparing ingredients for American Coffee
Preparing ingredients for Latte Coffee

4. 工厂模式的优缺点

优点:

    1. 解耦:客户端与具体产品类解耦,新增产品时只需要修改工厂类。
    1. 高内聚:对象创建的逻辑集中在工厂中,代码更清晰。

缺点:

    1. 工厂类的职责可能会变得过重,容易违背单一职责原则。
    1. 每增加一种新产品,都需要修改工厂类代码,违反开闭原则(这可以通过工厂方法模式改进)。

5. 总结

工厂模式是最常用的设计模式之一,它的核心思想就是将创建对象的逻辑集中管理,减少代码中的重复和耦合。通过咖啡店的例子,我们可以更容易理解工厂模式的用途。

在未来的专栏中,我们还会讲解其他设计模式,比如单例模式可以确保一杯咖啡只做一份,而装饰器模式可以为你的咖啡添加额外的配料。每一种设计模式,就像现实世界中的一套工具,帮助你更高效地构建程序。

思考问题:
如果你想扩展工厂模式,比如支持更多种类的咖啡(比如卡布奇诺),你会如何设计?欢迎在评论区分享你的看法!


http://www.ppmy.cn/news/1554484.html

相关文章

实习记录小程序+ssm

摘 要 随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

网络安全法-网络安全支持与促进

第二章 网络安全支持与促进 第十五条 国家建立和完善网络安全标准体系。国务院标准化行政主管部门和国务院其他有关部门根据各自的职责,组织制定并适时修订有关网络安全管理以及网络产品、服务和运行安全的国家标准、行业标准。 国家支持企业、研究机构、高等学…

FreeMatrix-C: 完整、安全的C/C++矩阵数学运算库开源库

FreeMatrix-C: An open source C/C matrix and vector library for safe computations(support version C99) 项目中需要将matlab代码转为支持MVS2010运行的C代码,鉴于中文互联网上的C/C矩阵运算资料在完整度、版本兼容性、可读性、安全性等方面有待进一步提升&…

神经网络的起源与工作原理

神经网络起源:一个生物神经网络是由一组化学上相连或功能上相关的神经元组成。一个神经元可能与许多其他神经元相连,网络中的神经元和连接的总数可能很广泛。连接,称为突触,通常是从轴突到树突形成的,尽管树突和其他连…

16、PyTorch中进行卷积残差模块算子融合

文章目录 1. 1x1卷积核-> 3x3卷积核2. 输入x --> 3x3卷积核,无变化3. 代码 1. 1x1卷积核-> 3x3卷积核 假设我们有一个1x1的卷积核,需要通过填充变为一个3x3的卷积核,实现的是像素之间无关联 [ 4 ] → [ 0 0 0 0 4 0 0 0 0 ] \begin{equation}…

Android显示系统(07)- OpenGL ES - 纹理Texture

Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角形 Android显示系统(05)- OpenGL…

JAVA学习日记(二十五)多线程

一、多线程概念 线程: 线程是操作系统能够进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位 (应用软件中相互独立,可以同时运行的功能) 进程: 进程是程序的基本执行实体 多线程应用场景&#x…

Connection对象,Statement对象和ResultSet对象的依赖关系 JDBC

在JDBC(Java Database Connectivity)中,Connection、Statement和ResultSet是三个主要的接口,用于与数据库进行交互。当Connection被关闭时,与之关联的Statement和ResultSet对象也会被关闭,这是因为它们之间…