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

设计模式:创建者模式

定义

创建者模式(Builder Pattern),又称建造者模式,是一种创建型设计模式,它提供了一种创建对象的最佳方式。该模式允许将一个复杂对象的构建与它的表示分离,这样同样的构建过程可以创建不同的表示。创建者模式通常使用一个指挥者(Director)类,它指导构建过程,以及一个或多个建造者(Builder)类,它们用于实现具体的构建步骤。

应用场景

创建者模式适用于以下场景:

  • 当一个对象需要多个部分组合在一起,并且对象的组合需要满足一定的构造过程时。
  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程允许被构造的对象有不同的表示时。

示例

假设我们需要创建一个复杂的Meal对象,它由DrinkMainCourseDessert组成。我们可以使用创建者模式来逐步构建这个Meal对象。

// 产品类
class Meal {private String drink;private String mainCourse;private String dessert;// getters and setters...
}// 抽象建造者
abstract class MealBuilder {protected Meal meal;public Meal getMeal() {return meal;}public void createNewMeal() {meal = new Meal();}public abstract void buildDrink();public abstract void buildMainCourse();public abstract void buildDessert();
}// 具体建造者
class ItalianMealBuilder extends MealBuilder {public void buildDrink() {meal.setDrink("Red Wine");}public void buildMainCourse() {meal.setMainCourse("Pizza");}public void buildDessert() {meal.setDessert("Gelato");}
}class JapaneseMealBuilder extends MealBuilder {public void buildDrink() {meal.setDrink("Sake");}public void buildMainCourse() {meal.setMainCourse("Sushi");}public void buildDessert() {meal.setDessert("Mochi");}
}// 指挥者
class Director {private MealBuilder mealBuilder;public Director(MealBuilder mealBuilder) {this.mealBuilder = mealBuilder;}public Meal construct() {mealBuilder.createNewMeal();mealBuilder.buildDrink();mealBuilder.buildMainCourse();mealBuilder.buildDessert();return mealBuilder.getMeal();}
}// 客户端代码
public class Client {public static void main(String[] args) {MealBuilder builder = new ItalianMealBuilder();Director director = new Director(builder);Meal meal = director.construct();// 使用meal对象...}
}

原则间的权衡与冲突

创建者模式遵循了几个软件设计原则:

  • 单一职责原则:通过将复杂对象的创建过程从其表示中分离出来,创建者模式使得同一个构建过程可以创建不同的表示。
  • 开闭原则:如果需要引入新的类型的对象,无需修改现有的指挥者和客户端代码,只需添加一个新的建造者类即可。

然而,如果对象的构建过程相对简单,或者不需要多样化的表示,使用创建者模式可能会导致不必要的复杂性。

设计模式的局限性

  • 复杂性:对于简单对象,使用创建者模式可能会导致设计变得过于复杂。
  • 性能开销:创建者模式中的多个步骤可能会导致性能开销,特别是在对象创建的热点路径中。

总结与建议

创建者模式非常适合构建复杂对象,尤其是当对象需要多个部分以特定顺序组合时。然而,如果对象的构造过程简单,或者不需要独立的表示,则应该避免使用创建者模式,以免增加不必要的复杂性。在决定是否使用创建者模式时,应该考虑当前和未来的需求,如果预计对象的构建将变得复杂,或者可能需要多种表示,则使用创建者模式可能是一个明智的选择。

相关文章:

  • 第四百四十三回
  • HTML1:html基础
  • 个人品牌打造IP孵化运营培训教程架构课件
  • 汽车网络安全管理
  • 【算法刷题day16】Leetcode:104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数
  • 微信小程序生命周期管理:从数据初始化到事件绑定
  • 【随笔】Git -- 高级命令(中篇)(七)
  • 【快速上手ESP32(基于ESP-IDFVSCode)】03-定时器
  • 数据结构 第六章(图)【上】
  • 使用docker-tc对host容器进行限流
  • Spring源码解析上
  • 机器学习模型——决策树
  • 【二分查找】Leetcode 二分查找
  • jdbc连SQL server,显示1433端口连接失败解决方法
  • 用html写一个爱心
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2019年如何成为全栈工程师?
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • C语言笔记(第一章:C语言编程)
  • docker python 配置
  • happypack两次报错的问题
  • js
  • Lucene解析 - 基本概念
  • Sublime text 3 3103 注册码
  • 爱情 北京女病人
  • 初识 webpack
  • 构建工具 - 收藏集 - 掘金
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 计算机常识 - 收藏集 - 掘金
  • 什么是Javascript函数节流?
  • 数组的操作
  • 小程序01:wepy框架整合iview webapp UI
  • 延迟脚本的方式
  • 《天龙八部3D》Unity技术方案揭秘
  • !!java web学习笔记(一到五)
  • !$boo在php中什么意思,php前戏
  • #LLM入门|Prompt#3.3_存储_Memory
  • #Spring-boot高级
  • #预处理和函数的对比以及条件编译
  • (3)STL算法之搜索
  • (javascript)再说document.body.scrollTop的使用问题
  • (poj1.3.2)1791(构造法模拟)
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)uboot源码分析
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • ??在JSP中,java和JavaScript如何交互?
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @RequestMapping处理请求异常
  • [C#] 如何调用Python脚本程序