设计模式之建造者模式

624 阅读3分钟

是将一个复杂对象的构建过程与它的表示分离,使得同样的构建过 程可以创建不同的表示,属于创建型模式。使用建造者模式对于用户而言只需指定需要建造的类型就可 以获得对象,建造过程及细节不需要了解。

优点

  • 封装性好,创建和使用分离
  • 扩展性好,建造类之间独立、一定程度上解耦

缺点

  • 产生多余的 Builder 对象;
  • 产品内部发生变化,建造者都要修改,成本较大

适用场景

建造者模式适用于一个具有较多的零件的复杂产品的创建过程,由于需求的变化,组成这个复杂产 品的各个零件经常猛烈变化,但是它们的组合方式却相对稳定。

  • 相同的方法,不同的执行顺序,产生不同的结果时
  • 多个部件或零件,都可以装配到一个对象中,但是产生的结果又不相同。
  • 产品类非常复杂,或者产品类中的调用顺序不同产生不同的作用。
  • 当初始化一个对象特别复杂,参数多,而且很多参数都具有默认值时。

场景的业务场景

例如 Query, 在sql条件无规律的情况下, 用户不在需要关心数据库具体需要的sql拼接规则, 而是通过链路调用的方式添加属性的查询逻辑, 是eq 还是 or 或是like, order by 等; 不再需要关心sql中某个关键字的位置, 可以避免手动拼接sql时产生的人为拼接错误;

例如: StringBuilder中, 我们拼接字符串的时候想要字符串拼接到一块, 那么java语言的特性, 因为String类是不可变, 一定会产生多个String对象; 那么用到Stringbuilder的时候, 它会将用户需要拼接的内容存储在char[]数组中, 等用户是什么时候拼接结束的时候调用 toString方法就可以将数组中的内容按原有添加顺序, 一次性进行转化成String

Demo 组装电脑,一台电脑有鼠标,键盘,主机,显示器,音响。。我们可以选择自己需要的

public class Computer {
    private String zhuji;
    private String shubiao;
    private String xianshiqi;
    private String yinxiang;
    private String jianpan;


    public void setShubiao(String shubiao) {
        this.shubiao = shubiao;
    }

    public void setJianpan(String jianpan) {
        this.jianpan = jianpan;
    }

    public void setXianshiqi(String xianshiqi) {
        this.xianshiqi = xianshiqi;
    }

    public void setYinxiang(String yinxiang) {
        this.yinxiang = yinxiang;
    }

    public void setZhuji(String zhuji) {
        this.zhuji = zhuji;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "zhuji='" + zhuji + '\'' +
                ", shubiao='" + shubiao + '\'' +
                ", xianshiqi='" + xianshiqi + '\'' +
                ", yinxiang='" + yinxiang + '\'' +
                ", jianpan='" + jianpan + '\'' +
                '}';
    }
}


public class ComputerBuilder {

    private Computer computer = new Computer();

    public ComputerBuilder needShubiao() {
        computer.setShubiao("鼠标");
        return this;
    }

    public ComputerBuilder needJianpan() {
        computer.setJianpan("键盘");
        return this;
    }

    public ComputerBuilder needYinxiang() {
        computer.setXianshiqi("音响");
        return this;
    }

    public ComputerBuilder needXianshiqi() {
        computer.setXianshiqi("显示器");
        return this;
    }

    public ComputerBuilder needZhuji() {
        computer.setZhuji("主机");
        return this;
    }

    public Computer build() {
        return this.computer;
    }
}


// 客户端
public class MainTest {
    public static void main(String[] args) {
        ComputerBuilder computerBuilder = new ComputerBuilder();
        Computer computer = computerBuilder.needZhuji().needJianpan().needZhuji().needShubiao().needXianshiqi().build();
        System.out.println(computer);
    }
}

JDK中的运用

StringBuilder类

建造者模式和工厂模式的区别

  • 建造者模式更加注重方法的调用顺序,工厂模式注重于创建对象
  • 创建对象的粒度不同,建造者模式创建复杂的对象,由各种复杂的部件组成,工厂模式创建出来 的都一样
  • 关注重点不一样,工厂模式模式只需要把对象创建出来就可以了,而建造者模式中不仅要创建出 这个对象,还要知道这个对象由哪些部件组成。
  • 建造者模式根据建造过程中的顺序不一样,最终的对象部件组成也不一样