其他网址

【狂神说Java】通俗易懂的23种设计模式教学(停更)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

有序的建造者模式

简介

场景

假设的场景:建一座房子。需要如下步骤:打地基、建墙体、铺电线、粉刷。这些步骤的顺序是不可颠倒的,而且任意一步不可缺少。

所有的类

Java设计模式--建造者模式_建造者模式

代码

房屋产品

package org.example.builder.product;

public class House {
    private String base;
    private String wall;
    private String wire;
    private String paint;

    public String getBase() {
        return base;
    }

    public void setBase(String base) {
        this.base = base;
    }

    public String getWall() {
        return wall;
    }

    public void setWall(String wall) {
        this.wall = wall;
    }

    public String getWire() {
        return wire;
    }

    public void setWire(String wire) {
        this.wire = wire;
    }

    public String getPaint() {
        return paint;
    }

    public void setPaint(String paint) {
        this.paint = paint;
    }

    @Override
    public String toString() {
        return "House{" +
                "base='" + base + '/'' +
                ", wall='" + wall + '/'' +
                ", wire='" + wire + '/'' +
                ", paint='" + paint + '/'' +
                '}';
    }
}

建造者

抽象类 

package org.example.builder.product;

public abstract class Builder {
    public abstract Builder buildBase(String base);

    public abstract Builder buildWall(String wall);

    public abstract Builder buildWire(String wire);

    public abstract Builder buildPaint(String paint);

    public abstract House build();
}

实现类

重点:在构造函数中,创建一个产品。

package org.example.builder.product;

public class Woker extends Builder {
    private House house;

    public Woker() {
        this.house = new House();
    }

    @Override
    public Builder buildBase(String base) {
        System.out.println("建造地基");
        house.setBase(base);
        return this;
    }

    @Override
    public Builder buildWall(String wall) {
        System.out.println("建造墙壁");
        house.setWall(wall);
        return this;
    }

    @Override
    public Builder buildWire(String wire) {
        System.out.println("铺设电线");
        house.setWire(wire);
        return this;
    }

    @Override
    public Builder buildPaint(String paint) {
        System.out.println("粉刷");
        house.setPaint(paint);
        return this;
    }

    @Override
    public House build() {
        return this.house;
    }
}

指挥者

简介

指挥者决定建造房子的顺序

指挥者决定具体每一步做什么样的建造。这样,可以造出简约、有大电流的电线、有隔音墙、地基为平房地基的平房,也可以造出其他配置的房子,比如:豪华粉刷、大电流、隔音墙、地基为高楼地基的高楼等。

代码

package org.example.builder;

import org.example.builder.product.Builder;
import org.example.builder.product.House;

public class Director {
    public static House build(Builder builder) {
        return builder
                .buildBase("平房地基")
                .buildWall("隔音墙")
                .buildWire("大电流的电线")
                .buildPaint("简约粉刷")
                .build();
    }
}

测试类

简介

指挥者(包工头)去指挥具体的工人去按照自己的步骤建造房子。

代码

package org.example.builder;

import org.example.builder.product.House;
import org.example.builder.product.Woker;

public class Consumer {
    public static void main(String[] args) {
        House build = Director.build(new Woker());
        System.out.println(build);
    }
}

执行结果

建造地基
建造墙壁
铺设电线
粉刷
House{base='平房地基', wall='隔音墙', wire='大电流的电线', paint='简约粉刷'}

无序的建造者模式

简介

场景

假设的场景:你去买一款手机,这款手机有多种可选的配置:颜色、运行内存、机身存储。

  • 如你果不指定,则给一个默认项,比如:黑色,6G,128G。
  • 如果你指定某些项,则给你你指定的配置,其他没指定的依然采用默认的配置。

所有的类

Java设计模式--建造者模式_建造者_02

对比有序的建造者模式

 无序,且每个字段有默认项,由用户来直接设置。

代码

手机产品

重点:提供静态的创建builder的方法;字段要设置默认值。

package org.example.builder.product;

public class Phone {
    private String color = "黑色(默认)";
    private String runningStorage = "6G(默认)";
    private String phoneStorage = "128G(默认)";

    public static DefaultBuilder builder() {
        return new DefaultBuilder();
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getRunningStorage() {
        return runningStorage;
    }

    public void setRunningStorage(String runningStorage) {
        this.runningStorage = runningStorage;
    }

    public String getPhoneStorage() {
        return phoneStorage;
    }

    public void setPhoneStorage(String phoneStorage) {
        this.phoneStorage = phoneStorage;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "color='" + color + '/'' +
                ", runningStorage='" + runningStorage + '/'' +
                ", phoneStorage='" + phoneStorage + '/'' +
                '}';
    }
}

建造者

建造者抽象类

package org.example.builder.product;

public abstract class Builder {
    public abstract Builder buildColor(String color);

    public abstract Builder buildRunningStorage(String runningStorage);

    public abstract Builder buildPhoneStorage(String phoneStorage);

    public abstract Phone build();
}

建造者实现类

重点:构造函数里边,要去构造一个产品。 

package org.example.builder.product;

public class DefaultBuilder extends Builder {
    private Phone phone;

    public DefaultBuilder() {
        this.phone = new Phone();
    }

    @Override
    public Builder buildColor(String color) {
        phone.setColor(color);
        return this;
    }

    @Override
    public Builder buildRunningStorage(String runningStorage) {
        phone.setRunningStorage(runningStorage);
        return this;
    }

    @Override
    public Builder buildPhoneStorage(String phoneStorage) {
        phone.setPhoneStorage(phoneStorage);
        return this;
    }

    @Override
    public Phone build() {
        return phone;
    }
}

测试类

package org.example.builder;

import org.example.builder.product.Phone;

public class Consumer {
    public static void main(String[] args) {
        Phone phone = Phone.builder()
                .buildColor("红色")
                .buildRunningStorage("8G")
                .build();
        System.out.println(phone);
    }
}

执行结果

Phone{color='红色', runningStorage='8G', phoneStorage='128G(默认)'}