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

news2024/12/12 18:30:51

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

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

1. 什么是工厂模式?

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

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

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

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

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

3. 工厂模式的代码实现

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

3.1 咖啡类

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

// 定义咖啡的抽象类
abstract class Coffee {
    public abstract String getName();

    public void prepare() {
        System.out.println("Preparing ingredients for " + getName());
    }
}

// 美式咖啡
class AmericanCoffee extends Coffee {
    @Override
    public String getName() {
        return "American Coffee";
    }
}

// 拿铁咖啡
class LatteCoffee extends Coffee {
    @Override
    public String getName() {
        return "Latte Coffee";
    }
}

3.2 咖啡工厂

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

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 客户端代码

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

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.coloradmin.cn/o/2258362.html

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

相关文章

【网络协议栈】TCP/IP协议栈中重要协议和技术(DNS、ICMP、NAT、代理服务器、以及内网穿透)

每日激励:“请给自己一个鼓励说:Jack我很棒!—Jack” 绪论​: 本章是TCP/IP网络协议层的完结篇,本章将主要去补充一些重要的协议和了解一些网络中常见的名词,具体如:DNS、ICMP、NAT、代理服务器…

离屏渲染概述

我们知道,图像的处理基本都是在GPU中进行,然后GPU将渲染的结果放入当前渲染屏幕的帧缓冲区中,视频控制器取出里面的内容,在屏幕上进行显示。那么有没有什么情况,会因为某些限制,GPU无法将全部的渲染结果直接…

探索 Python 应用的分层依赖:解决 Linux 环境中的 libvirt-python 安装问题

探索 Python 应用的分层依赖:解决 Linux 环境中的 libvirt-python 安装问题 背景Python 版本升级 问题描述原因分析与解决方案 Python 应用的分层依赖:安装与部署的视角libvirt-python的分层依赖尝试的解决方案 使用编译好的 .whl 文件"嫁接"整…

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

声明 因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱 ESXI主机为192.168.20.10 VCSA为192.168.20.7,后台为192.168.20.7:5480 后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来 第一阶段…

Unity3D下采集camera场景并推送RTMP服务实现毫秒级延迟直播

技术背景 好多开发者,希望我们能够分享下如何实现Unity下的camera场景采集并推送rtmp服务,然后低延迟播放出来。简单来说,在Unity 中实现采集 Camera 场景并推送RTMP的话,先是获取 Camera 场景数据,通过创建 RenderTex…

指令周期流程图

例题一 例题二 例题三

使用C#通过ColorMatrix对象为图像重新着色

此示例产生了一些令人印象深刻的结果,但实际上非常简单。 它使用其他几个示例演示的 ImageAttribute 技术来快速操作图像的颜色。 下面的AdjustColor方法启动图像着色的过程。 // Adjust the images colors. private Image AdjustColor(Image image) {// Make the …

SQL 在线格式化 - 加菲工具

SQL 在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql,点击上方的格式化按钮即可 输入框得到格式化后的sql结果

AI作图效率高,亲测ToDesk、顺网云、青椒云多款云电脑AIGC实践创作

一、引言 随着人工智能生成内容(AIGC)的兴起,越来越多的创作者开始探索高效的文字处理和AI绘图方式,而云电脑也正成为AIGC创作中的重要工具。相比于传统的本地硬件,云电脑在AIGC场景中展现出了显著的优势,…

【密码学】SM4算法

一、 SM4算法简介 SM4算法是中国国家密码管理局于2012发布的一种分组密码算法,其官方名称为SMS4(SMS4.0),相关标准为GM/T 0002-2012《SM4分组密码算法》。SM4算法的分组长度和密钥长度均为128比特,采用非平衡Feistel结构。采用32…

Proteus(8.15)仿真下载安装过程(附详细安装过程图)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、Proteus是什么? 二、下载链接 三、下安装步骤 1.解压,有键管理员运行 2.点击Next,进行下一步 3.勾选I accept…&#…

【工业机器视觉】基于深度学习的水表盘读数识别(4-训练与预测)

【工业机器视觉】基于深度学习的仪表盘识读(读数识别)(3)-CSDN博客 训练与预测 Ultralytics YOLO指的是由Ultralytics公司开发的一系列基于YOLO(You Only Look Once)架构的目标检测算法。YOLO是一种实时目标检测系统,它…

AlphaPose、yolov8Pose、RTMPose进行对比

一、Alphapose 参考: https://blog.csdn.net/m0_45850873/article/details/123939849

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID,它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能,还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID? 在 MongoDB …

ARM学习(36)静态扫描规则学习以及工具使用

笔者来学习了解一下静态扫描以及其规则,并且亲身是实践一下对arm 架构的代码进行扫描。 1、静态扫描认识 静态扫描:对代码源文件按照一定的规则进行扫描,来发现一些潜在的问题或者风险,因为不涉及代码运行,所以其一般只是发现一些规范或则一些质量问题,当然这些可能存在潜…

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级 迁移前的准备工作迁移步骤详解第一步:查看源码第二步:启动类迁移第三步:引入 Gateway 依赖第四步 编写bootstrap.yaml第五步:替换路由配置第六步&#…

centos部署SkyWalking并在springcloud项目中用法举例

文章目录 场景SkyWalking介绍部署部署Storage [单机版Elasticsearch]部署SkyWalking OAP [下载地址](https://skywalking.apache.org/downloads/#SkyWalkingAPM)部署SkyWalking Java Agent springCloud 使用举例 场景 SkyWalking是应用性能监控平台,可用于分布式系统…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆,用以运送各种汽油、柴油、原油等油品,运输危险系数大,而且由于油罐车需要经常行驶在城区道路,为城市各个加油站点、企业工厂运输补充所需油料,因此也是危化品运输车辆的重点监测和管控对象…

【总结·反思·汇报·思考02】裸辞后,我的一些感想和感悟。

Hello,大家好! 首先,我需要向大家道个歉,对不起!因为最近发生了一些事情,博客文章一直没有更新。(90度鞠躬道歉) 那么,最近到底发生了什么呢?相信大家已经从…

李宏毅机器学习-局部最小值与鞍点

一、Optimization Fails because …… 1. 问题 在optimization时,training的loss不会再下降,但是我们对loss并不满意。不管我们怎么更新参数,loss都不会掉下来。 2. 原因:critical point(gra…