设计模式-建造者模式

文章目录

设计模式-建造者模式

建造者模式适用场景

需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。

需要生成的产品对象的属性相互依赖,需要指定其生成顺序。

对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中。

隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

案例场景

现实生活中我们去买车,一般同一辆车会有多个版本,根据配置不一样,分为经典版、舒适版、豪华版等,比如经典版是手动挡手动座椅,舒适版是自动挡全景天窗等。

定义产品角色

java 复制代码
@Data
public class Car {
    // 车名称
    private String name;
    // 自动挡
    private String automaticCatch;
    // 手动挡
    private String manualTransmission;
    // 全景天窗
    private String panoramicSunroof;
    // 自动座椅
    private String automaticSeat;
    // 手动座椅
    private String manualSeat;
    // 倒车影像
    private String reversingImage;
}

一坨坨代码实现

java 复制代码
public class CarController {
    public Car getCarInstance(String carName) {
        Car car = new Car();
        if ("经典版".equals(carName)) {
            car.setName("经典版");
            car.setManualTransmission("手动挡");
        } else if ("舒适版".equals(carName)) {
            car.setName("舒适版");
            car.setAutomaticCatch("自动挡");
            car.setManualSeat("手动座椅");
        } else if ("豪华版".equals(carName)) {
            car.setName("豪华版");
            car.setAutomaticCatch("自动挡");
            car.setAutomaticSeat("自动座椅");
            car.setReversingImage("倒车影像");
            car.setPanoramicSunroof("全景天窗");
        } else {
            throw new IllegalArgumentException("carName is error: carName=" + carName);
        }
        return car;
    }
}

测试

java 复制代码
@Test
public void test(){
    CarController carController = new CarController();
    System.out.println(carController.getCarInstance("豪华版").toString());
}

重构代码

创建抽象建造者类

java 复制代码
public abstract class CarBuilder {

    public abstract Car buildClassic();

    public abstract Car buildComfortable();

    public abstract Car buildLuxury();
}

创建具体建造者类

java 复制代码
public class CarConcreteBuilder extends CarBuilder {

    @Override
    public Car buildClassic() {
        Car car = new Car();
        car.setName("经典版");
        car.setManualTransmission("手动挡");
        return car;
    }

    @Override
    public Car buildComfortable() {
        Car car = new Car();
        car.setName("舒适版");
        car.setAutomaticCatch("自动挡");
        car.setManualSeat("手动座椅");
        return car;
    }

    @Override
    public Car buildLuxury() {
        Car car = new Car();
        car.setName("豪华版");
        car.setAutomaticCatch("自动挡");
        car.setAutomaticSeat("自动座椅");
        car.setReversingImage("倒车影像");
        car.setPanoramicSunroof("全景天窗");
        return car;
    }
}

创建我们的导演类

java 复制代码
public class CarDirector {

    private CarBuilder carBuilder;

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

    public Car classicConstruct() {
        return carBuilder.buildClassic();
    }

    public Car comfortableConstruct() {
        return carBuilder.buildComfortable();
    }

    public Car luxuryConstruct() {
        return carBuilder.buildLuxury();
    }
}

测试

java 复制代码
@Test
public void test(){
    CarBuilder carBuilder = new CarConcreteBuilder();
    CarDirector carDirector = new CarDirector(carBuilder);
    Car comfortableCar = carDirector.luxuryConstruct();
    System.out.println(comfortableCar);
}

与工厂模式区别

工厂模式是由工厂类来负责创建对象,而建造者模式也是让具体建造者类负责创建对象,那这两者有什么区别呢?

实际上工厂模式是用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象。而建造者模式是用来创建一种类型的复杂对象,通过设置不同的可选参数,"定制化"地创建不同的对象。

可以形象的解释:

顾客走进一家餐馆点餐,我们利用工厂模式,根据用户不同的选择,来制作不同的食物,比如披萨、汉堡、沙拉。

对于披萨来说,用户又有各种配料可以定制,比如奶酪、西红柿、起司,我们通过建造者模式根据用户选择的不同配料来制作披萨。

建造者模式优缺点

主要优点

在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。

每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。由于指挥者类针对抽象建造者编程,增加新的具体建造者无须修改原有类库的代码,系统扩展方便,符合"开闭原则"

由于具体每个建造者过程是独立的,因此可以对过程更加细化,而不会对其它模块产生影响。

主要缺点

建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,例如很多组成部分都不相同,不适合使用建造者模式,因此其使用范围受到一定的限制。

如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加系统的理解难度和运行成本。

相关推荐
计算机源码社8 分钟前
分享一个餐饮连锁店点餐系统 餐馆食材采购系统Java、python、php三个版本(源码、调试、LW、开题、PPT)
java·python·php·毕业设计项目·计算机课程设计·计算机毕业设计源码·计算机毕业设计选题
汤兰月13 分钟前
Python中的观察者模式:从基础到实战
开发语言·python·观察者模式
CocoaAndYy1 小时前
设计模式-单例模式
单例模式·设计模式
西柚与蓝莓2 小时前
【开源开放体系总结】
python
bobostudio19953 小时前
TypeScript 设计模式之【策略模式】
前端·javascript·设计模式·typescript·策略模式
belldeep5 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
ok!ko7 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
FreakStudio8 小时前
全网最适合入门的面向对象编程教程:56 Python字符串与序列化-正则表达式和re模块应用
python·单片机·嵌入式·面向对象·电子diy
丶21368 小时前
【CUDA】【PyTorch】安装 PyTorch 与 CUDA 11.7 的详细步骤
人工智能·pytorch·python
拉里小猪的迷弟8 小时前
设计模式-创建型-常用:单例模式、工厂模式、建造者模式
单例模式·设计模式·建造者模式·工厂模式