Java设计模式之建造者模式(Builder模式)
Builder模式是用于构建复杂对象的一种模式。是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用Builder模式来替代多参数构造函数是一个比较好的实践法则。
场景
车分很多种如:
- 汽车:名字,价格,有发动机,有棚子
- 电动三轮车:名字,价格,有棚子
- 自行车:名字,价格,不堵车
其实为每个车写一个构造函数也可以实现,但是当车子多了,就不便于维护了。创建者模式就是解决这一类问题
应用举例
定义一个多功能的车
/**
* Created by yunzhao.liu on 2017/12/27
*/
public class Car {
private String name;//名字
private int price;//价格
private boolean isTrafficjam;//堵车
private boolean isHaveEngine;//发动机
private boolean isHaveShed;//棚子
public static class Builder {
private String name;//名字
private int price;//价格
private boolean isTrafficjam;//堵车
private boolean isHaveEngine;//发动机
private boolean isHaveShed;//棚子
// 构建的步骤
public Builder() {
}
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setPrice(int price) {
this.price = price;
return this;
}
public Builder setTrafficjam(boolean trafficjam) {
isTrafficjam = trafficjam;
return this;
}
public Builder setHaveEngine(boolean haveEngine) {
isHaveEngine = haveEngine;
return this;
}
public Builder setHaveShed(boolean haveShed) {
isHaveShed = haveShed;
return this;
}
public Car build() { // 构建,返回一个新对象
return new Car(this);
}
}
private Car(Builder b) {
name = b.name;
price = b.price;
isTrafficjam = b.isTrafficjam;
isHaveEngine = b.isHaveEngine;
isHaveShed = b.isHaveShed;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
", isTrafficjam=" + isTrafficjam +
", isHaveEngine=" + isHaveEngine +
", isHaveShed=" + isHaveShed +
'}';
}
}
测试类
/**
* Created by yunzhao.liu on 2017/12/27
* 测试类
*/
public class TestBuilder {
public static void main(String[] args) {
//奥迪A6
Car aodi = new Car.Builder()
.setName("奥迪A6")
.setPrice(200000)
.setTrafficjam(true)
.setHaveEngine(true)
.setHaveShed(true)
.build();
String s1 = aodi.toString();
System.out.println(s1);
//三轮车
Car tricycle = new Car.Builder()
.setName("三轮车")
.setPrice(2500)
.setHaveEngine(true)
.setHaveShed(true)
.build();
String s2 = tricycle.toString();
System.out.println(s2);
//自行车
Car bicycle = new Car.Builder()
.setName("自行车")
.setPrice(300)
.setTrafficjam(false)
.build();
String s3 = bicycle.toString();
System.out.println(s3);
}
}