Java建造者模式(Builder pattern)

简介: Java建造者模式(Builder pattern)

模式简介

建造者模式又称生成器模式,所属创建型设计模式,它提供了一种最佳的创建对象方式,将多个简单的对象一步一步构建成一个复杂的对象。对于用户而言,无需知道创建过程和内部组成细节,只需直接使用创建好的对象即可。

f31867f7aef644ad95760215caca0afb.png

结构定义

建造者模式结构较为复杂,它除了包含建造者类之外,还包含一个指挥者类。

包含角色如下 👇

  1. Builder(抽象建造者)

抽象建造者为创建一个产品 Product对象的各个部件指定抽象接口,在该接口中一般声明两类方法,一类方法是 buildPartX(),它们用于创建复杂对象的各个部件;另一类方法是getResult(),它们用于返回复杂对象。它既可以是抽象类,也可以是接口。


  1. ConcreteBuilder(具体建造者)

具体建造者实现了Builder接口,实现各个部件的构造和装配方法,定义并明确它所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象。


  1. Product(产品角色)

产品角色是被构建的复杂对象,包含多个组成部件﹐具体建造者创建该产品的内部表示并定义它的装配过程。


  1. Director(指挥者)

指挥者又称为导演类,它负责安排复杂对象的建造次序,指挥者与抽象建造者之间存在关联关系,可以在其construct()建造方法中调用建造者对象的部件构造与装配方法,完成复杂对象的建造。客户端一般只需要与指挥者进行交互,在客户端确定具体建造者的类型,并实例化具体建造者对象(也可以通过配置文件和反射机制),然后通过指挥者类的构造函数或者Setter方法将该对象传入指挥者类中。


模式案例

  • 下面通过KFC套餐实例来进一步学习并理解建造者模式。

说明:建造者模式可以用于描述KFC如何创建套餐,套餐是一个复杂对象,它一般包含主食(如汉堡、鸡肉卷等)和饮料(如果汁,可乐等)等组成部分,不同的套餐有不同的组成部分,而KFC的服务员可以根据顾客的要求,一步一步装配这些组成部分,构造一份完整的套餐,然后返回给顾客。


a11feb4ddb7d44ae991fd072510e95a3.png

  1. 产品类 Meal(套餐类)

套餐类Meal是复杂产品对象﹐它包括两个成员属性food 和 drink,其中 food表示主食,drink 表示饮料,在 Meal中还包含成员属性的Getter方法和Setter方法。


8f0db10d7c2b41deb77f72e245c235d8.png

  1. 抽象建造者类 MealBuilder(套餐建造者类)

MealBuilder是套餐建造者,它是一个抽象类,声明了抽象的部件组装方法 buildFood()和 buildDrink(),在 MealBuilder 中定义了Meal类型的对象meal,提供了工厂方法 getMeal()用于返回meal对象。


141bbf68948e4eb0ba6e2cee3f1c2916.png

  1. 具体建造者类 SubMealBuilderA(A 套餐建造者类)

SubMealBuilderA是具体建造者类,它用于创建A套餐,它是抽象建造者类的子类,实现了在抽象建造者中声明的部件组装方法,该套餐由一个鸡腿堡与一杯可乐组成。

eeba3cb6c1e24ceeb189a694367aa043.png

  1. 具体建造者类SubMealBuilderB(B套餐建造者类)

SubMealBuilderB也是具体建造者类,它用于创建B套餐,该套餐由一个鸡肉卷与一杯果汁组成。

46f6c9e7dc124877bb468cbcda3ea14a.png

  1. 指挥者类 KFCWaiter(服务员类)


KFCWaiter类是指挥者类,在KFC套餐制作过程中,它就是KFC的服务员。在其中定义了一个抽象建造者类型的变量mb,具体建造者类型由客户端指定,在其construct()方法中调用mb对象的部件组装方法和工厂方法,用于向客户端返回-份包含主食和饮料的完整套餐。

19f6d165de954f41807f0981cac536fd.png

  1. 客户端测试类 Client

在客户端测试类中,通过new具体建造者类的类名可以获得一个具体建造者对象mb,然后将其传入指挥者类KFCWaiter的对象 waiter 中,通过 waiter 的construct()方法来调用套餐的组成方法并返回套餐给客户端。

fab33a01ec2e4459bac5bad8b335f51d.png

022d464c33c54d249b2129e6d014b65d.png


如果要更换套餐我们只需要更换具体的建造者无需更改源码,如果需要增加一个新的套餐,只需要继承抽象建造者类,再实现在其中声明的抽象部件组装方法,即可使用新的具体建造者构造新的类型的套餐。


模式总结


建造者模式的主要优点在于客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象,每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,符合“开闭原则”,还可以更加精细地控制产品的创建过程。


其主要缺点是由于建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,因此其使用范围受到一定的限制,如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。


建造者模式和之前文章所讲的工厂模式有何区别


  1. 工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。
  2. 建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。


好了到此建造者就总结完毕了,如果有幸帮到你还请一键三连加个关注~ 感谢!


相关文章
|
18天前
|
Java 网络安全 Maven
Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
35 2
|
8天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
6月前
|
设计模式 算法 Java
【设计模式】JAVA Design Patterns——Builder(构造器模式)
【设计模式】JAVA Design Patterns——Builder(构造器模式)
|
3月前
|
存储 JSON 前端开发
【Java】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天
在实际项目中,使用 `@JsonFormat(pattern = "yyyy-MM-dd")` 注解导致出生日期少了一天的问题,根源在于夏令时的影响。本文详细解析了夏令时的概念、`@JsonFormat` 注解的使用方法,并提供了三种解决方案:在注解中添加 `timezone = GMT+8`、修改 JVM 参数 `-Duser.timezone=GMT+08`,以及使用 `timezone = Asia/Shanghai
340 0
【Java】用@JsonFormat(pattern = “yyyy-MM-dd“)注解,出生日期竟然年轻了一天
|
3月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
4月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
55 0
|
5月前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)
|
5月前
|
设计模式 Java
Java设计模式之建造者模式详解
Java设计模式之建造者模式详解
|
6月前
|
设计模式 安全 Java
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)
该文介绍了一种C++的编程技巧——奇异递归模板模式(CRTP),旨在让派生组件能继承基本组件的特定功能。通过示例展示了如何创建一个`Fighter`接口和`MmaFighter`类,其中`MmaFighter`及其子类如`MmaBantamweightFighter`和`MmaHeavyweightFighter`强制类型安全,确保相同重量级的拳手之间才能进行比赛。这种设计避免了不同重量级拳手间的错误匹配,编译时会报错。CRTP适用于处理类型冲突、参数化类方法和限制方法只对相同类型实例生效的情况。
【设计模式】JAVA Design Patterns——Curiously Recurring Template Pattern(奇异递归模板模式)