设计模式之建造者模式

  •   大家好!欢迎莅临厚土燎原的天地,深感荣幸能与您相遇在此,共同品读我的拙作。您的阅读如同春风化雨,对我而言意义非凡。衷心邀请您留下宝贵的评论与指点,每一字一句都是对我莫大的鼓励与鞭策。热烈欢迎,期待与您智慧碰撞,共绘思想的火花!


目录

描述

角色

优点

缺点

适用场景

总结

实例

产品

抽象构造者

具体构建者

指导类

应用


描述

建造者模式(Builder Pattern),也称生成器模式,是一种创建型设计模式。它主要用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这种模式通过将复杂对象的创建过程分解为不同的步骤,并将这些步骤封装在不同的建造者类中,从而使得创建过程更加灵活和清晰。

本质:将复杂对象的构建分为很多小对象的构建。将复杂的构建和它的表示分离,使同样的构建过程可以创建不同的表示。


角色

1、Product(产品角色):表示被构建的复杂对象。它通常包含多个组成部件的类,以及这些部件的装配方式。

2、Builder(抽象建造者):为创建一个Product对象的各个部件指定抽象接口。这个接口通常包含一系列构建方法,用于逐步构建复杂对象。

3、ConcreteBuilder(具体建造者):实现Builder接口,完成复杂产品的各个部件的具体创建方法。在构建过程完成后,它还提供产品的实例。

4、Director(指挥者):构建一个使用Builder接口的对象。它通常不直接与产品类交互,而是通过调用建造者类的方法来构建产品。它负责控制产品的构建过程,包括调用哪些构建方法以及调用的顺序。


优点

1、封装性好:建造者模式封装了产品的创建过程,客户端只需要指定需要创建的产品类型和内容,具体创建过程由建造者负责,这有助于将复杂对象的创建过程与表示分离,使得相同的创建过程可以创建不同的产品对象。

2、扩展性好:建造者模式中的建造者类是相互独立的,符合开闭原则(对扩展开放,对修改关闭)。当需要增加新的产品或者修改现有产品的创建过程时,只需要增加新的建造者类或者修改现有建造者类的实现,而不需要修改原有的类库,这有助于保持系统的稳定性和可扩展性。

3、便于控制:建造者模式可以精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰和易于管理。同时,通过引入指挥者类,可以进一步封装和简化创建过程,使得客户端代码更加简洁。

4、灵活性高:由于建造者模式的独立性,可以很方便地替换具体建造者或增加新的具体建造者,这使得系统能够灵活地应对不同的需求和变化。


缺点

1、增加类数量:建造者模式会创建较多的类,包括抽象建造者类、具体建造者类以及指挥者类等,这可能会增加系统的复杂性和理解难度。特别是当产品内部变化复杂时,可能需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

2、内部修改困难:如果产品内部发生变化,可能需要修改多个建造者类来适应这种变化,这可能会增加系统的维护成本。此外,如果产品之间的差异性很大,建造者模式可能不是最佳选择,因为需要定义大量的具体建造者类来覆盖所有情况。

3、适用范围有限:建造者模式适用于创建复杂对象的情况,特别是当对象的创建过程涉及多个步骤且这些步骤之间存在依赖关系时。然而,如果产品之间的差异性很大或者创建过程相对简单,使用建造者模式可能会带来不必要的复杂性。


适用场景

1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2、当构造过程必须允许被构造的对象有不同表示时。

3、当一个类有很多参数需要设置,且这些参数设置有一定的顺序或依赖关系时,可以使用建造者模式来封装这些参数的设置过程,使得客户端代码更加简洁。


总结

简述:用来创建复杂的复合对象

一句话概括:高配中配和低配,想选哪配就哪配

目的:开放个性配置步骤

生活案例:选配


实例

产品

public class Computer {

    private String cpu;
    private String ram;
    private String usb;
    private String keyboard;
    private String display;

    public Computer(String cpu,String ram){
        this.cpu = cpu;
        this.ram = ram;
    }

    public void setUsb(String usb) {
        this.usb = usb;
    }

    public void setKeyboard(String keyboard) {
        this.keyboard = keyboard;
    }

    public void setDisplay(String display) {
        this.display = display;
    }
    
    @Override
    public String toString() {
        return "Computer{" +
            "cpu='" + cpu + '\'' +
            ", ram='" + ram + '\'' +
            ", usb=" + usb +
            ", keyboard='" + keyboard + '\'' +
            ", display='" + display + '\'' +
            '}';
    }
}

抽象构造者

public interface ComputerBuilder {

    void setUsb(String usb);

    void setKeyboard(String keyboard);

    void setDisplay(String display);

    Computer getComputer();

}

具体构建者

public class LenovoComputerBuilder implements ComputerBuilder{

    private Computer computer;

    public LenovoComputerBuilder(String cpu,String ram){
        computer = new Computer(cpu, ram);
    }

    @Override
    public void setUsb() {
        computer.setUsb("Lenovo usb");
    }

    @Override
    public void setKeyboard() {
        computer.setKeyboard("Lenovo keyboard");
    }

    @Override
    public void setDisplay() {
        computer.setDisplay("Lenovo display");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}


public class AppleComputerBuilder implements ComputerBuilder{

    private Computer computer;

    public AppleComputerBuilder(String cpu,String ram){
        computer = new Computer(cpu,ram);
    }

    @Override
    public void setUsb() {
        computer.setUsb("apple usb");
    }

    @Override
    public void setKeyboard() {
        computer.setKeyboard("apple keyboard");
    }

    @Override
    public void setDisplay() {
        computer.setDisplay("apple display");
    }

    @Override
    public Computer getComputer() {
        return computer;
    }
}

指导类

public class ComputerDirector {

    private ComputerBuilder computerBuilder;

    public ComputerDirector(){
    }

    public Computer construct(){
        computerBuilder.setDisplay();
        computerBuilder.setKeyboard();
        computerBuilder.setUsb();
        return computerBuilder.getComputer();
    }

    public void setComputerBuilder(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }
}

应用

public static void main(String[] args) {
    ComputerDirector computerDirector = new ComputerDirector();

    ComputerBuilder appleComputerBuilder = new AppleComputerBuilder("i5","三星");
    computerDirector.setComputerBuilder(appleComputerBuilder);
    Computer appleComputer = computerDirector.construct();
    System.out.println(appleComputer);

    ComputerBuilder lenovoComputerBuilder = new LenovoComputerBuilder("i7","海力士");
    computerDirector.setComputerBuilder(lenovoComputerBuilder);
    Computer lenovoComputer = computerDirector.construct();
    System.out.println(lenovoComputer);
}
结果:
Computer{cpu='i5', ram='三星', usb=apple usb, keyboard='apple keyboard', display='apple display'}
Computer{cpu='i7', ram='海力士', usb=Lenovo usb, keyboard='Lenovo keyboard', display='Lenovo display'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厚土燎原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值