设计模式——建造者模式

339 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

概述

通过多个简单的对象一步一步构建成一个复杂的对象,类比与lambok中的@builder注解

将一些不变的条件抽离出来构建一个对象

封装一个对象的构造过程,并允许按步骤构造

使用场景

当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。

例如

比如造房子,钢筋、水泥、木材是一定需要的,就可以从钢筋、水泥、木材入手构建一个房子对象.薯片炸鸡可乐鸡块,可以构建成各种不同的套餐

比如@Builder注解构建对象时候,可以针对类中的每个属性赋值,也就是针对每个简单的属性赋值,最后构建出一个完整的对象

Person.builder.name("tom").age(20).color("write").build;

逻辑实现

  1. 创建一个类A,这个A的属性很多,构造方法多种多样
  2. 在A中构造一个静态内部类ABuilder,其属性与A的属性一致
  3. ABuilder的构造方法参数是A的构造必须的参数
  4. ABuilder中有很多setXXX()的发放,返参还是ABuilder
  5. 有个build方法,返参是A

代码实现

public class A{
    private final String color;//必须
    private final String shape;//必须
    private final int price;//可选
    private final String detail;//可选
    private final String tips;//可选

    private A(ABuilder aBuilder){
        this.color=aBuilder.color;
        this.shape=aBuilder.shape;
        this.price=aBuilder.price;
        this.detail=aBuilder.detail;
        this.tips=aBuilder.tips;
    }
    public static class ABuilder{
        private String color;//必须
        private String shape;//必须
        private int price;//可选
        private String detail;//可选
        private String tips;//可选

        public ABuilder(String color,String shape){
            this.color=color;
            this.shape=shape;
        }

        public ABuilder setPrice(int price) {
            this.price = price;
            return this;
        }
        public ABuilder setDetail(String detail) {
            this.detail = detail;
            return this;
        }
        public ABuilder setTips(String tips) {
            this.tips = tips;
            return this;
        }        
        public A build(){
            return new A(this);
        }
    }
  //省略getter方法
}


A a=new A.ABuilder("red","圆")
                .setPrice(1)
                .setDetail("大")
                .setTips("very nice")
                .build();

lombok的builder注解就是这么实现的逻辑

还可以参考下StringBuilder的append和StringBuffer

还有一种更加规范的实现模式:通过Client、Director、Builder和Product形成的建造者模式

但是本质的特点和该逻辑是一致的,只是实现上更为的符合设计特点.更加抽象