当前位置: 首页 > 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. 灵活性

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

结论

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

相关文章:

  • 【js】Node.js的fs的使用方法
  • Spring源码学习:SpringMVC(3)mvcannotation-driven标签解析【RequestMappingHandlerMapping生成】
  • 技术成神之路:设计模式(十六)代理模式
  • Python库matplotlib之五
  • 【RabbitMq源码阅读】分析RabbitMq发送消息源码
  • Robot Operating System——一组三维空间中的位姿(位置和方向)
  • Flink集群部署
  • kafka下载配置
  • Go 1.19.4 序列化和反序列化-Day 16
  • 速盾:视频开cdn合适还是视频点播合适?
  • 大模型智能体在金融公告理解领域的应用 | OPENAIGC开发者大赛高校组AI创新之星奖
  • 语音音频(wav)声纹识别-技术实现-python
  • 【JavaEE初阶】网络原理
  • 性能优化与资源管理:优化Selenium脚本的执行效率,合理管理浏览器实例和系统资源
  • CSS给一行按钮统一设置间隔
  • JAVA 学习IO流
  • js ES6 求数组的交集,并集,还有差集
  • Material Design
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SQLServer之创建数据库快照
  • Vue小说阅读器(仿追书神器)
  • Zepto.js源码学习之二
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 多线程 start 和 run 方法到底有什么区别?
  • 仿天猫超市收藏抛物线动画工具库
  • 排序算法学习笔记
  • 前端
  • 如何学习JavaEE,项目又该如何做?
  • 小程序01:wepy框架整合iview webapp UI
  • 用quicker-worker.js轻松跑一个大数据遍历
  • No resource identifier found for attribute,RxJava之zip操作符
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #if #elif #endif
  • #laravel 通过手动安装依赖PHPExcel#
  • $forceUpdate()函数
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (pojstep1.3.1)1017(构造法模拟)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)原始图像数据和PDF中的图像数据
  • (自用)交互协议设计——protobuf序列化
  • .gitignore文件—git忽略文件
  • .NetCore发布到IIS
  • .NET开源、简单、实用的数据库文档生成工具
  • .skip() 和 .only() 的使用
  • .stream().map与.stream().flatMap的使用
  • /var/spool/postfix/maildrop 下有大量文件
  • :“Failed to access IIS metabase”解决方法
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)