Java设计模式之创建型模式 | 建造者模式

42 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 12 天,点击查看活动详情

觉得对你有益的小伙伴记得点个赞+关注

后续完整内容持续更新中

希望一起交流的欢迎发邮件至javalyhn@163.com

1. 建造者模式定义

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2. 建造者模式使用场景

  1. 相同的方法,不同的执行顺序,产生不同的事件结果时。
  2. 多个部件或者零件,都可以装配到不同的对象中,但是产生的结果又不同。
  3. 产品类十分的复杂,或者产品类中的调用顺序不同产生了不同的技能。
  4. 在对象创建过程中会使用到系统的一些其他对象,这些对象在产品对象的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。该种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段竟然没有发觉,而要通过创建者模式柔化创建过程,本身已经违反最初的设计目标。
  5. StringBuilder:append(); 给谁append呢?
  6. Swagger-ApiBuilder:
  7. 快速实现->Lombok-Builder模式

3. 建造者模式的实现

我们设定以下做手机的过程。

image.png

AbstractBuilder

/**
 * 抽象建造者
 */
public abstract class AbstractBuilder  {

    Phone phone;
    abstract AbstractBuilder customCpu(String cpu);
    abstract AbstractBuilder customMem(String mem);
    abstract AbstractBuilder customDisk(String disk);
    abstract AbstractBuilder customCam(String cam);

    Phone getProduct(){
        return phone;
    }
}

XiaomiBuilder

public class XiaomiBuilder  extends AbstractBuilder{

    public XiaomiBuilder(){
        phone = new Phone();
    }

    /**
     *
     * @param cpu
     */
    @Override
    AbstractBuilder customCpu(String cpu) {
        phone.cpu = cpu;
        return this;
    }

    @Override
    AbstractBuilder customMem(String mem) {
        phone.mem = mem;
        return this;
    }

    @Override
    AbstractBuilder customDisk(String disk) {
        phone.disk = disk;
        return this;
    }

    @Override
    AbstractBuilder customCam(String cam) {
        phone.cam = cam;
        return this;
    }
}

Phone

public class Phone {

    protected String cpu;
    protected String mem;
    protected String disk;
    protected String cam;

    public Phone() {
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + ''' +
                ", mem='" + mem + ''' +
                ", disk='" + disk + ''' +
                ", cam='" + cam + ''' +
                '}';
    }

    public String getCpu() {
        return cpu;
    }

    public String getMem() {
        return mem;
    }

    public String getDisk() {
        return disk;
    }

    public String getCam() {
        return cam;
    }
}
public class MainTest {

    public static void main(String[] args) {

        AbstractBuilder builder = new XiaomiBuilder();

        Phone phone = builder.customCpu("骁龙8个8")
                .customCam("2亿")
                .customDisk("1T")
                .customMem("16G")
                .getProduct();
    }
}

image.png

我们可以直接使用lombok的@Builder注解,标在产品类上,就可以直接使用建造者模式

Phone

@Builder
public class Phone {

    protected String cpu;
    protected String mem;
    protected String disk;
    protected String cam;


    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + ''' +
                ", mem='" + mem + ''' +
                ", disk='" + disk + ''' +
                ", cam='" + cam + ''' +
                '}';
    }


   get().......
}

XiaomiBuilder

public class XiaomiBuilder  extends AbstractBuilder{


    public XiaomiBuilder(){
//        phone =
//                new Phone();
        phone = Phone.builder().build();//关键
    }
Phone build = Phone.builder()
        .cpu("1")
        .mem("2")
        .cam("3")
        .disk("4")
        .build();

System.out.println(build);

image.png

4. 建造者模式的优点

  • 封装性: 使用建造者模式可以是客户端不必知道产品内部的细节。
  • 建造者独立,容易扩展。
  • 便于控制细节风险: 由于具体的构建者是独立的,因此可以对创建过程逐步细化,而不对其他的模块产生任何影响。