建造者模式

2021-05-18  本文已影响0人  金煜博

什么是建造者模式

将复杂的对象结构使用建造者进行分离,在使用指挥者进行重组,生成不同类别的对象信息

经典版造者模式

示例图

图片.png

示例场景

将品牌 价钱属性抽象化,尺寸 数量固定,构建出不同品牌的手机产品

示例代码

1.创建MobilePhone手机产品类

public class MobilePhone {
    private String brand;//手机品牌  可选参数
    private String price;//手机价钱  可选参数
    private String size; //手机尺寸  必填参数
    private String number; //手机数量    必填参数

    public MobilePhone(String size, String number) {
        this.size = size;
        this.number = number;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "MobilePhone{" +
                "brand='" + brand + '\'' +
                ", price='" + price + '\'' +
                ", size='" + size + '\'' +
                ", number='" + number + '\'' +
                '}';
    }
}

2.创建MobilePhoneBuilder手机构建者类

public abstract class MobilePhoneBuilder {
    public abstract void brand();
    public abstract void price();
    public abstract MobilePhone getMobilePhone();
}

3.创建IPhoneBuilder苹果手机和华为手机具体构建者类

public class IPhoneBuilder extends MobilePhoneBuilder {
    private MobilePhone mobilePhone;


    public IPhoneBuilder(String size,String number) {
        mobilePhone = new MobilePhone(size,number);
    }

    @Override
    public void brand() {
        mobilePhone.setBrand("品牌-iphone11");

    }

    @Override
    public void price() {
        mobilePhone.setPrice("价格-5788");
    }

    @Override
    public MobilePhone getMobilePhone() { 
        return mobilePhone;
    }
}
public class HuaweiBuider extends MobilePhoneBuilder{

    private MobilePhone mobilePhone;

    public HuaweiBuider(String size,String number) {
        mobilePhone = new MobilePhone(size,number);
    }

    @Override
    public void brand() {
        mobilePhone.setBrand("品牌-huaweiP40");
    }

    @Override
    public void price() {
        mobilePhone.setPrice("价钱-4899");
    }

    @Override
    public MobilePhone getMobilePhone() {
        return mobilePhone;
    }
}

4.创建MobliePhoneDirector指挥者类

public class MobliePhoneDirector {
    public void  makePhone(MobilePhoneBuilder mobilePhoneBuilder){
        mobilePhoneBuilder.brand();
        mobilePhoneBuilder.price();
    }
}

5.创建启动类

public class Test {
    public static void main(String[] args) {
        //指挥者
        MobliePhoneDirector mobliePhoneDirector = new MobliePhoneDirector();
        //iphone构建者
        MobilePhoneBuilder iPhoneBuilder = new IPhoneBuilder("1","5.8");
        //调用具体的构建方法
        mobliePhoneDirector.makePhone(iPhoneBuilder);
        //返回iphone手机的构建好的对象信息
        MobilePhone iphone =  iPhoneBuilder.getMobilePhone();
        //输出tostring内容
        String strIphone =  iphone.toString();
        System.out.println(strIphone);

        //huawei构建者
        HuaweiBuider huaweiBuider = new HuaweiBuider("1", "6.8");
        mobliePhoneDirector.makePhone(huaweiBuider);
        MobilePhone huawei = huaweiBuider.getMobilePhone();
        String strHw = huawei.toString();
        System.out.println(strHw);
    }
}

6.运行结果

图片.png

精简版建造者模式(实际开发中常用)

使用静态内部类对原对象进行重组,用于解决类中构造函数参数过多的问题

示例代码

public class Phone {
    private final String brand;//手机品牌  可选参数
    private final String price;//手机价钱  可选参数
    private final String size; //手机尺寸  必填参数
    private final String number; //手机数量    必填参数

    private Phone(Builder builder) {
        this.brand = builder.brand;
        this.price = builder.price;
        this.size = builder.size;
        this.number = builder.number;
    }

    public String getBrand() {
        return brand;
    }

    public String getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "brand='" + brand + '\'' +
                ", price='" + price + '\'' +
                ", size='" + size + '\'' +
                ", number='" + number + '\'' +
                '}';
    }

    public static class Builder {
        private String brand;//手机品牌  可选参数
        private String price;//手机价钱  可选参数
        private String size; //手机尺寸  必填参数
        private String number; //手机数量    必填参数

        public Builder(String size, String number) {
            this.size = size;
            this.number = number;
        }

        public Builder setBrand(String brand) {
            this.brand = brand;
            return this;

        }

        public Builder setPrice(String price) {
            this.price = price;
            return this;
        }

        public Phone build() {
            return new Phone(this);
        }
    }

    public static void main(String[] args) {
        Phone phone = new Phone.Builder("6.8", "1")
                .setBrand("华为p40")
                .setPrice("6000")
                .build();
        System.out.println(phone.toString());
    }
}
上一篇 下一篇

猜你喜欢

热点阅读