当前位置: 首页 > news >正文

工厂模式与建造者模式的区别

在软件设计中,工厂模式和建造者模式是两种常见的设计模式,它们都是用于创建对象,但是各自有不同的应用场景和目的。本文将通过餐馆点餐的例子,深入探讨这两种模式的区别。

工厂模式

工厂模式的核心思想是通过一个抽象工厂类来创建对象,而不直接使用构造函数。它主要用于当我们希望将对象的创建过程与使用过程分离时,并且可以支持多种类型的对象创建。

示例:餐馆的工厂模式

假设顾客走进一家餐馆,想要点餐。餐馆提供多种食物,比如披萨、汉堡和沙拉。我们可以使用工厂模式来创建这些食物。

// 抽象产品
interface Food {void prepare();
}// 具体产品
class Pizza implements Food {@Overridepublic void prepare() {System.out.println("准备披萨...");}
}class Burger implements Food {@Overridepublic void prepare() {System.out.println("准备汉堡...");}
}class Salad implements Food {@Overridepublic void prepare() {System.out.println("准备沙拉...");}
}// 抽象工厂
abstract class FoodFactory {public abstract Food createFood();
}// 具体工厂
class PizzaFactory extends FoodFactory {@Overridepublic Food createFood() {return new Pizza();}
}class BurgerFactory extends FoodFactory {@Overridepublic Food createFood() {return new Burger();}
}class SaladFactory extends FoodFactory {@Overridepublic Food createFood() {return new Salad();}
}// 使用示例
public class Restaurant {public static void main(String[] args) {FoodFactory factory = new PizzaFactory();Food food = factory.createFood();food.prepare();}
}

在这个例子中,FoodFactory是一个抽象工厂,负责创建不同类型的食物对象。具体工厂如PizzaFactoryBurgerFactorySaladFactory实现了创建具体食物的逻辑。顾客只需要指定工厂类型,工厂就会返回对应的对象。

建造者模式

建造者模式用于构建一个复杂对象,尤其是当对象的构建过程涉及多个步骤或多个可选参数时。它通过提供一个灵活的构建接口,让用户能够逐步构造复杂对象。

示例:披萨的建造者模式

在我们的餐馆中,顾客可以根据个人喜好来定制披萨的配料,比如奶酪、西红柿和起司。我们可以使用建造者模式来实现这一点。

class Pizza {private String cheese;private String tomato;private String extra;public static class Builder {private String cheese;private String tomato;private String extra;public Builder setCheese(String cheese) {this.cheese = cheese;return this;}public Builder setTomato(String tomato) {this.tomato = tomato;return this;}public Builder setExtra(String extra) {this.extra = extra;return this;}public Pizza build() {// 校验至少选择一种配料if (cheese == null && tomato == null && extra == null) {throw new IllegalArgumentException("至少选择一种配料!");}return new Pizza(this);}}private Pizza(Builder builder) {this.cheese = builder.cheese;this.tomato = builder.tomato;this.extra = builder.extra;}public void serve() {System.out.println("服务披萨: " + cheese + ", " + tomato + ", " + extra);}
}// 使用示例
public class Customer {public static void main(String[] args) {try {Pizza pizza = new Pizza.Builder()// .setCheese("马苏里拉") // Uncomment to test.setTomato("新鲜").setExtra("香肠").build();pizza.serve();} catch (IllegalArgumentException e) {System.out.println(e.getMessage());}}
}

在这个例子中,Pizza.Builder类允许顾客选择不同的配料,最终构建出一个完整的披萨对象。

区别总结

  1. 目的

    • 工厂模式:主要关注对象的创建,适用于创建简单或多种类型的对象。
    • 建造者模式:关注对象的构建过程,适用于构建复杂对象,尤其是有多个可选参数的情况,可以采用链式结构存储,
  2. 使用场景

    • 工厂模式:适合需要生成多个产品(如不同类型的食物)时,隐藏创建细节。
    • 建造者模式:适合构建步骤复杂的对象(如披萨),提供灵活的配置选项。
  3. 灵活性

    • 工厂模式:一般只提供一种创建方式。
    • 建造者模式:允许逐步构建,灵活性更高。

结论

在设计软件时,选择合适的模式至关重要。工厂模式和建造者模式各有其独特的优势,理解它们的区别和适用场景将有助于我们在实际开发中作出更好的设计选择。通过餐馆的例子,我们可以清晰地看到如何利用这两种设计模式来满足不同的需求。

相关文章:

工厂模式与建造者模式的区别

在软件设计中,工厂模式和建造者模式是两种常见的设计模式,它们都是用于创建对象,但是各自有不同的应用场景和目的。本文将通过餐馆点餐的例子,深入探讨这两种模式的区别。 工厂模式 工厂模式的核心思想是通过一个抽象工厂类来创…...

电脑usb接口封禁如何实现?5种禁用USB接口的方法分享!(第一种你GET了吗?)

“防患于未然,安全始于细节。”在信息技术飞速发展的今天,企业的信息安全问题日益凸显。 USB接口作为数据传输的重要通道,在带来便利的同时,也成为了数据泄露和安全风险的高发地。 因此,对电脑USB接口进行封闭管理&a…...

有效的括号

有效的括号 思路&#xff1a;我们先创建一个栈&#xff0c;让左括号入栈&#xff0c;与右括号判断 Stack stacknew Stack<>(); 将字符串中的符号转化为字符 char ch s.charAt(i); 完整代码如下&#xff1a; class Solution {public boolean isValid(String s) {if (s …...

Vue3.0面试题汇总

Composition API 可以说是Vue3的最大特点&#xff0c;那么为什么要推出Composition Api&#xff0c;解决了什么问题&#xff1f; 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的方式&#xff0c;都存在缺…...

TCP编程:从入门到实践

目录 一、引言 二、TCP协议原理 1.面向连接 2.可靠传输 三、TCP编程实践 1.TCP服务器 2.TCP客户端 四、总结 本文将带你了解TCP编程的基本原理&#xff0c;并通过实战案例&#xff0c;教你如何在网络编程中运用TCP协议。掌握TCP编程&#xff0c;为构建稳定、高效的网络通信…...

Python NumPy 数据分析:处理复杂数据的高效方法

Python NumPy 数据分析&#xff1a;处理复杂数据的高效方法 文章目录 Python NumPy 数据分析&#xff1a;处理复杂数据的高效方法一 数据来源二 获取指定日期数据三 获取指定行列数据四 求和计算五 比例计算六 平均值和标准差七 完整代码示例八 源码地址 本文详细介绍了如何使用…...

【Preference Learning】Reasoning with Language Model is Planning with World Model

arxiv: https://arxiv.org/abs/2305.14992 问题背景&#xff1a;当前LLM推理受到几个关键因素的限制&#xff1a; &#xff08;1&#xff09;LLM缺乏世界模型&#xff08;一种人类就有的对环境的心理表征&#xff0c;可以模拟行动以及活动对外部世界状态的影响&#xff09;去…...

OJ在线评测系统 后端基础部分开发 完善CRUD相关接口

完善相关接口 判斷编程语言是否合法 先从用户的请求拿到Language package com.dduo.dduoj.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dduo.dduoj…...

计算机网络--TCP、UDP抓包分析实验

计算机网络实验 目录 实验目的 实验环境 实验原理 1、UDP协议 2、TCP协议 实验具体步骤 实验目的 1、掌握使用wireshark工具对UDP协议进行抓包分析的方法&#xff0c;掌握UDP协议的报文格式&#xff0c;掌握UDP协议校验和的计算方法&#xff0c;理解UDP协议的优缺点&am…...

FreeRTOS的中断管理

前言 FreeRTOS的任务有优先级&#xff0c;MCU的硬件中断有中断优先级&#xff0c;这是两个不同的概念&#xff0c;FreeRTOS的任务管理要用到硬件中断&#xff0c;使用FreeRTOS时候也可以使用硬件中断&#xff0c;但是硬件中断ISR的设计要注意一些设计原则&#xff0c;在本节中我…...

JS加密=JS混淆?(JS加密、JS混淆,是一回事吗?)

JS加密、JS混淆&#xff0c;是一回事吗&#xff1f; 是的&#xff01;在国内&#xff0c;JS加密&#xff0c;其实就是指JS混淆。 1、当人们提起JS加密时&#xff0c;通常是指对JS代码进行混淆加密处理&#xff0c;而不是指JS加密算法&#xff08;如xor加密算法、md5加密算法、…...

hive-拉链表

目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息&#xff0c;比如用户手机号码信息。然而随着时间的变化&#xff0c;某些用户信息会发生改…...

高并发内存池(六):补充内容

目录 有关大于256KB内存的申请和释放处理方法 处理大于256KB的内存申请 补充内容1 补充内容2 补充内容3 处理大于256KB的内存释放 新增内容1 新增内容2 测试函数 使用定长内存池替代new 释放对象时不传对象大小 补充内容1 补充内容2 补充内容3 补充内容4 测试…...

高性能存储 SIG 月度动态:优化 fuse 提升 AI 存储接入能力,erofs 工具发布新版本

本次月报综合了 SIG 在 7、8 两个月的工作进展&#xff0c;包含多项新特性、优化、Bugfix 等。 SIG 整体进展 fuse 支持 failover&#xff0c;并优化 background 读写公平性&#xff0c;提升 AI 存储接入场景的能力。 erofs page cache 共享特性已发到上游社区&#xff0c;re…...

2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程

Protobuf 序列化概述 Protobuf&#xff08;Protocol Buffers&#xff09;是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件&#xff08;.proto&#xff09;来描述数据结构&#xff0c;并通过…...

【小程序】微信小程序课程 -4 项目实战

目录 1、 效果图 2、创建项目 2.1 创建小程序端 2.1.1 先创建纯净项目 2.1.2 删除components 2.1.4 删除app.json红色部分 2.1.5 删除index.json红色部分 2.1.6 删除index.wxss全部内容 2.1.7 删除index.wxml全部内容 2.1.8 app.json创建4个页面 2.1.9 app.json添加…...

【期刊】论文索引库-SCI\SSCI\IE\南大核心\北大核心\CSCD等

外文期刊检索 SCI SCI即《科学引文索引》(Science Citation Index),是由美国科学信息研究所(Institute for Scientific Information)创建于1961年,收录文献的作者、题目、源期刊、摘要、关键词,不仅可以从文献引证的角度评估文章的学术价值,还可以迅速方便地组建研究课…...

开源链动 2+1 模式 S2B2C 商城小程序:社交电商团队为王的新引擎

摘要&#xff1a;本文深入探讨在社交电商领域中&#xff0c;团队的重要性以及如何借助开源链动 21 模式 S2B2C 商城小程序&#xff0c;打造具有强大竞争力的团队&#xff0c;实现个人价值与影响力的放大&#xff0c;创造被动收入&#xff0c;迈向财富自由之路&#xff0c;同时为…...

使用Fiddler Classic抓包工具批量下载音频资料

1. 通过F12开发者工具&#xff0c;下载音频文件 浏览器打开音频列表->F12快捷键->网络->媒体&#xff0c;播放一个音频文件&#xff0c;右边媒体下生成一个音频文件&#xff0c;右击“在新标签页中打开”&#xff0c;可以下载这个音频文件。 2.通过Fiddler Classic抓…...

QT开发:基于Qt实现的交通信号灯模拟器:实现一个带有倒计时功能的图形界面应用

介绍 本文将介绍如何使用Qt框架实现一个简单的交通信号灯控制程序。本程序包括一个图形界面&#xff0c;显示红、黄、绿三色信号灯&#xff0c;并通过定时器控制信号灯的切换。同时&#xff0c;我们还将实现一个带有按钮的界面&#xff0c;用于展示信号灯的状态。 1. 安装Qt开…...

开源工具Jellyfin豆瓣插件高效配置指南:打造完美中文媒体库

开源工具Jellyfin豆瓣插件高效配置指南&#xff1a;打造完美中文媒体库 【免费下载链接】jellyfin-plugin-douban Douban metadata provider for Jellyfin 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-douban 在数字媒体收藏日益增长的今天&#xff0…...

果园灌溉施肥控制系统改造之西门子 S7 - 1200 PLC 实战

果园灌溉施肥控制系统改3 西门子s7-1200plc程序博途v16&#xff0c;带 选型表 io表接线图CAD和运行效果视频最近搞了个果园灌溉施肥控制系统的改造项目&#xff0c;用的是西门子 S7 - 1200 PLC&#xff0c;编程软件是博途 V16&#xff0c;这过程还挺有意思&#xff0c;跟大家…...

消防给水系统控制:西门子 S7 - 200 与昆仑通态触摸屏的奇妙组合

消防给水系统控制&#xff0c;西门子S7-200&#xff0c;昆仑通态触摸屏YH25 1.采用西门子S7-200PLC&#xff0c;CPU226EM223数字量模块EM231模拟量模块。 2.昆仑通态MCGS触摸屏及软件&#xff0c;可自行转换新版MCGSPRO程序。 3.两水泵一用二备和二用一备可切换&#xff0c;故障…...

ViGEmBus虚拟手柄驱动:Windows内核级游戏控制器模拟核心技术解析与应用指南

ViGEmBus虚拟手柄驱动&#xff1a;Windows内核级游戏控制器模拟核心技术解析与应用指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus ViGEmBus作为Windows…...

告别手动调参!模糊PID如何让直流电机在负载突变时稳如泰山?

模糊PID控制&#xff1a;让直流电机在负载突变时稳如泰山的实战指南 引言&#xff1a;工业自动化中的电机控制痛点 在自动化产线上&#xff0c;直流电机突然遭遇负载变化时&#xff0c;你是否也经历过这样的场景&#xff1f;——机械臂正在精准抓取工件&#xff0c;突然因为物料…...

如何快速下载网易云音乐双语歌词:LrcHelper完整指南

如何快速下载网易云音乐双语歌词&#xff1a;LrcHelper完整指南 【免费下载链接】LrcHelper 从网易云音乐下载带翻译的歌词 Walkman 适配 项目地址: https://gitcode.com/gh_mirrors/lr/LrcHelper LrcHelper是一款专门为网易云音乐用户设计的免费歌词下载工具&#xff0…...

基于STM32CubeMX的AD9850驱动开发与频率合成实战

1. 从零开始认识AD9850与STM32CubeMX 第一次接触AD9850这个芯片时&#xff0c;我完全被它的性能震撼到了——这个比指甲盖还小的芯片&#xff0c;居然能产生0.0291Hz分辨率的信号&#xff01;当时我正在做一个射频测试项目&#xff0c;需要生成精确的正弦波信号。市面上常见的…...

苹果内购Java后端避坑指南:沙盒测试、凭据验证与订单防重的那些事儿

苹果内购Java后端避坑指南&#xff1a;沙盒测试、凭据验证与订单防重的那些事儿 第一次对接苹果应用内购&#xff08;IAP&#xff09;时&#xff0c;我以为按照官方文档走完流程就万事大吉了。直到凌晨三点收到服务器告警——重复充值、验证超时、沙盒环境漏测等问题接踵而至。…...

深入解析WIFI中EAP-TLS认证流程与安全机制

1. EAP-TLS认证&#xff1a;WIFI安全连接的基石 每次我们用手机连接公司或学校的WIFI时&#xff0c;系统总会弹出一个证书确认的窗口&#xff0c;这就是EAP-TLS在发挥作用。作为目前最安全的WIFI认证协议之一&#xff0c;它就像网络世界的"护照查验系统"&#xff0c;…...

TrafficMonitor插件系统终极指南:3步打造个性化系统监控中心

TrafficMonitor插件系统终极指南&#xff1a;3步打造个性化系统监控中心 【免费下载链接】TrafficMonitorPlugins 用于TrafficMonitor的插件 项目地址: https://gitcode.com/gh_mirrors/tr/TrafficMonitorPlugins TrafficMonitor插件系统是一款强大的扩展框架&#xff0…...