设计模式-建造者模式

设计模式专栏



模式介绍

建造者模式是一种对象构建模式,可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。它一步一个脚印地创建复杂的对象,允许用户只通过指定复杂对象的类型和内容就可以构建它们,而不需要知道内部的具体构建细节。

建造者模式包括四个角色:

  1. Product(产品角色):一个具体的产品对象。
  2. Builder(抽象建造者):创建一个Product对象的各个部件指定的接口。
  3. ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。
  4. Director(指挥者):构建一个使用Builder接口的对象。

建造者模式主要用于创建复杂的对象,它主要有两个作用:一是隔离了客户与对象的生产过程,二是负责控制产品对象的生产过程。

模式特点

建造者模式的主要特点包括:

    1. 封装性好,构建和表示分离。建造者模式可以将一个复杂对象的构建过程与其表示分离开来,使得同样的构建过程可以创建不同的表示。
    1. 扩展性好,各个具体的建造者相互独立,有利于系统的解耦。使用建造者模式可以使客户端不必知道产品内部组成的细节,建造者可以对创建过程逐步细化,而不对其他模块产生任何影响,便于控制细节风险。
    1. 建造者模式可以灵活选择构建过程中的具体实现。客户端通过指定不同的具体建造者来选择不同的构建过程,从而创建不同的产品表现形式。
    1. 便于控制细节风险:由于具体的产品建造是独立的,因此可以对建造过程逐步细化,而不对其他的模块产生任何影响。客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程进行解耦,使得创建产品的具体过程更加清晰,便于控制细节风险。

然而,建造者模式也有一些缺点。例如,产品的组成部分必须相同,这限制了其使用范围。如果产品的内部变化复杂,则建造者也要同步修改,后期维护成本较大。

应用场景

  1. 创建复杂对象:当需要创建的对象具有多个组成部分,并且这些组成部分的构建顺序可能不同时,使用建造者模式可以简化对象的创建过程。
  2. 构建过程的抽象:当创建对象的构建过程需要依赖于特定的实现细节时,使用建造者模式可以将构建过程抽象出来,使得构建过程可以独立于具体的实现细节。
  3. 需要对产品进行逐步配置的场景:当需要对产品进行逐步配置时,例如在软件配置管理中,可以使用建造者模式逐步构建产品对象,并允许在运行时动态修改配置。
  4. 需要对产品进行细粒度控制的场景:当需要对产品进行细粒度控制时,例如在构建过程中需要对各个组成部分进行逐个配置或组装时,可以使用建造者模式。

总之,建造者模式适用于需要创建复杂对象的场景,尤其是当对象的构建顺序或组成部分不确定时。使用建造者模式可以简化对象的创建过程,提高代码的可读性和可维护性。

应用实例

  1. 肯德基套餐:肯德基的套餐中包含汉堡、可乐、薯条、炸鸡翅等组成部分,这些组成部分是固定的,但套餐的组合方式是经常变化的,通过不同的组合方式可以生成不同的套餐,这就是建造者模式的应用。
  2. Java中的StringBuilder:StringBuilder是一个用于构建字符串的类,它允许用户逐步构建字符串,而无需一次性构建完整的字符串。StringBuilder类提供了各种方法,如append()、insert()、delete()等,用于逐步构建字符串。这也是建造者模式的应用。

以上是建造者模式的一些应用实例,建造者模式还可以应用于其他需要创建复杂对象的场景中。

代码示例

Java代码示例

以下是一个简单的Java代码示例,演示了建造者模式的使用:

java 复制代码
// 定义一个抽象建造者类
public interface CarBuilder {
    public void setBody();
    public void setEngine();
    public void set Transmission();
    public Car getCar();
}

// 定义一个具体建造者类,实现抽象建造者类的方法
public class SportCarBuilder implements CarBuilder {
    private Car car = new Car();

    public void setBody() {
        car.setBodyStyle("Sport");
    }

    public void setEngine() {
        car.setEngineType("High Performance");
    }

    public void setTransmission() {
        car.setTransmissionType("Manual");
    }

    public Car getCar() {
        return car;
    }
}

// 定义一个产品类,即要构建的对象
public class Car {
    private String bodyStyle;
    private String engineType;
    private String transmissionType;

    public Car() {
    }

    public void setBodyStyle(String bodyStyle) {
        this.bodyStyle = bodyStyle;
    }

    public void setEngineType(String engineType) {
        this.engineType = engineType;
    }

    public void setTransmissionType(String transmissionType) {
        this.transmissionType = transmissionType;
    }
}

// 定义一个指挥者类,用于构建对象
public class CarBuilderDirector {
    private CarBuilder carBuilder;

    public CarBuilderDirector(CarBuilder carBuilder) {
        this.carBuilder = carBuilder;
    }

    public void build() {
        carBuilder.setBody(); // 构建车身部分,将参数传递给具体建造者类中的setBody方法,并执行该方法。 执行完该方法后,返回具体建造者对象本身。 同样地,将参数传递给具体建造者类中的setEngine和setTransmission方法,并执行这两个方法。 最后返回具体建造者对象本身。 调用具体建造者对象中的getCar方法,返回构建好的产品对象。 这样就完成了对象的构建过程。 最终客户端可以通过调用CarBuilderDirector类中的build方法来构建一个完整的汽车对象。
   }

python实现建造者模式

以下是一个Python代码示例,演示了建造者模式的使用:

python 复制代码
from abc import ABC, abstractmethod

# 定义一个抽象建造者类
class CarBuilder(ABC):
    @abstractmethod
    def set_body(self):
        pass

    @abstractmethod
    def set_engine(self):
        pass

    @abstractmethod
    def set_transmission(self):
        pass

    @abstractmethod
    def get_car(self):
        pass

# 定义一个具体建造者类,实现抽象建造者类的方法
class SportCarBuilder(CarBuilder):
    def __init__(self):
        self.car = Car()

    def set_body(self):
        self.car.body_style = "Sport"

    def set_engine(self):
        self.car.engine_type = "High Performance"

    def set_transmission(self):
        self.car.transmission_type = "Manual"

    def get_car(self):
        return self.car

# 定义一个产品类,即要构建的对象
class Car:
    def __init__(self):
        self.body_style = ""
        self.engine_type = ""
        self.transmission_type = ""

# 定义一个指挥者类,用于构建对象
class CarBuilderDirector:
    def __init__(self, car_builder):
        self.car_builder = car_builder

    def build(self):
        self.car_builder.set_body()  # 构建车身部分,将参数传递给具体建造者类中的setBody方法,并执行该方法。执行完该方法后,返回具体建造者对象本身。同样地,将参数传递给具体建造者类中的setEngine和setTransmission方法,并执行这两个方法。最后返回具体建造者对象本身。调用具体建造者对象中的getCar方法,返回构建好的产品对象。这样就完成了对象的构建过程。最终客户端可以通过调用CarBuilderDirector类中的build方法来构建一个完整的汽车对象。

建造者模式在spring中的应用

建造者模式在Spring框架中有广泛的应用,主要体现在以下几个方面:

1. 对象创建 :Spring框架中的BeanFactory和ApplicationContext是建造者模式的典型应用。它们通过读取配置文件或注解来创建和管理对象,并根据需要注入依赖关系。这些对象的创建过程是通过建造者模式来实现的,将对象的创建逻辑从客户端代码中分离出来,提高了代码的可读性和可维护性。
2. 数据源配置 :在Spring框架中,数据源的配置通常是通过建造者模式来实现的。例如,DataSourceBuilder类提供了一系列方法来构建DataSource对象,可以根据不同的数据库类型和配置参数来创建不同的数据源对象。
3. 消息模板 :Spring框架中的JmsTemplate和RestTemplate等消息模板类也是建造者模式的应用。这些模板类通过封装底层的消息发送和接收细节,为客户端提供了简单易用的API。客户端可以通过调用模板类的方法来发送和接收消息,而无需关心底层的实现细节。
4. 安全配置 :在Spring Security中,安全配置通常是通过建造者模式来实现的。例如,SecurityBuilder类提供了一系列方法来构建安全配置对象,可以根据不同的安全需求和配置参数来创建不同的安全配置对象。

通过以上例子可以看出,建造者模式在Spring框架中的应用主要体现在对象的创建和配置方面。通过将对象的创建和配置逻辑从客户端代码中分离出来,提高了代码的可读性和可维护性,降低了客户端代码与具体实现之间的耦合度。同时,建造者模式也为Spring框架提供了更加灵活和可扩展的配置方式,可以根据不同的需求来定制不同的配置对象。


【设计模式-单例模式】 【设计模式-工厂模式】

相关推荐
xlsw_2 分钟前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹1 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭1 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫2 小时前
泛型(2)
java
超爱吃士力架2 小时前
邀请逻辑
java·linux·后端
南宫生2 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石2 小时前
12/21java基础
java
李小白662 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp2 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶3 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb