什么是建造者模式
将复杂的对象结构使用建造者进行分离,在使用指挥者进行重组,生成不同类别的对象信息
经典版造者模式
示例图
![](https://img.haomeiwen.com/i25887870/d0f6607e5e7dbad5.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.运行结果
![](https://img.haomeiwen.com/i25887870/e0246482e65d89ac.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());
}
}
网友评论