【设计模式】建造者模式

用于一个类拥有很多属性的场景;
构建者模式强调组成一个对象的组成过程;如果属性很多,用构造器需要传递很多参数;

1.产品类

package No4_构建者模式;

/**
 * 产品对象
 */
public class Bike {
    private String frame;
    private String seat;

    public String getFrame() {
        return frame;
    }

    public void setFrame(String frame) {
        this.frame = frame;
    }

    public String getSeat() {
        return seat;
    }

    public void setSeat(String seat) {
        this.seat = seat;
    }
}

2.Builder类

  • 1.声明产品类
  • 2.声明 用于构建车的组件的 几个抽象方法
  • 3.声明 用于构建车 抽象方法
package No4_构建者模式;

public abstract class Builder {
    //todo 1.声明产品类
    protected Bike bike = new Bike();

    //todo 2.声明 用于构建车的组件的 几个抽象方法
    public abstract void buildFrame();
    public abstract void buildSeat();
    //todo 3.声明 用于构建车 抽象方法
    public abstract Bike createBike();

}

3.指挥类

  • 指挥类用于调用Builder类,来组装一个对象
package No4_构建者模式;

public class Director {
    //todo 1.声明一个Builder
    private Builder mBuilder;


    //todo 2.传入一个Builder实现类
    public Director(Builder builder) {
        mBuilder = builder;
    }


    //todo 3. 组装过程
    public Bike construct() {
        mBuilder.buildFrame();
        mBuilder.buildSeat();
        return mBuilder.createBike();
    }
}

4.构建过程

4.1 一个具体的产品Builder类

package No4_构建者模式;

/**
 * 具体的构建者
 * 用于构建摩拜单车
 */
public class MobikeBuilder  extends Builder {

    @Override
    public void buildFrame() {
        bike.setFrame("铝合金车架");
    }

    @Override
    public void buildSeat() {
        bike.setSeat("真皮车座");
    }

    @Override
    public Bike createBike() {
        return bike;
    }
}

4.2 客户端使用

package No4_构建者模式;

public class Client {
    public static void main(String[] args) {
        
        Director director = new Director(new MobikeBuilder());
        Bike bike = director.construct();
        System.out.println(bike.getSeat());
    }
}

模式扩展

1.普通的创建对象

package No4_构建者模式.模式扩展;

public class Phone {
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;

    public Phone(String cpu, String screen, String memory, String mainboard) {
        this.cpu = cpu;
        this.screen = screen;
        this.memory = memory;
        this.mainboard = mainboard;
    }

    public String getCpu() {
        return cpu;
    }

    public void setCpu(String cpu) {
        this.cpu = cpu;
    }

    public String getScreen() {
        return screen;
    }

    public void setScreen(String screen) {
        this.screen = screen;
    }

    public String getMemory() {
        return memory;
    }

    public void setMemory(String memory) {
        this.memory = memory;
    }

    public String getMainboard() {
        return mainboard;
    }

    public void setMainboard(String mainboard) {
        this.mainboard = mainboard;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }
}
class Client1 {
    public static void main(String[] args) {
        //构建Phone对象
        Phone phone = new Phone("intel","三星屏幕","金士顿","华硕");
        System.out.println(phone);
    }
}

2.模式扩展

  • 将Builder类用作内部类
package No4_构建者模式.模式扩展;

public class Phone2{
        private String cpu;
        private String screen;
        private String memory;
        private String mainboard;

        private Phone2(Builder builder) {
            cpu = builder.cpu;
            screen = builder.screen;
            memory = builder.memory;
            mainboard = builder.mainboard;
		}

public static final class Builder {
    private String cpu;
    private String screen;
    private String memory;
    private String mainboard;

    public Builder() {}

    public Builder cpu(String val) {
        cpu = val;
        return this;
    }
    public Builder screen(String val) {
        screen = val;
        return this;
    }
    public Builder memory(String val) {
        memory = val;
        return this;
    }
    public Builder mainboard(String val) {
        mainboard = val;
        return this;
    }

    public Phone2 build() {
        return new Phone2(this);}
}
    @Override
    public String toString() {
        return "Phone{" +
                "cpu='" + cpu + '\'' +
                ", screen='" + screen + '\'' +
                ", memory='" + memory + '\'' +
                ", mainboard='" + mainboard + '\'' +
                '}';
    }
}

class Client2 {
    public static void main(String[] args) {
        Phone2 phone = new Phone2.Builder()
                .cpu("intel")
                .mainboard("华硕")
                .memory("金士顿")
                .screen("三星")
                .build();
        System.out.println(phone);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值