一、应用场景
1,初始化一个对象非常复杂,参数多,很多参数都有默认值;
2,多个部件或零件,都可以装配到一个对象中,但是产生的结果又不同;
3,对象属性之间存在依赖关系,如果使用set方式会导致这种关系和校验得不到验证。比如规定长方形面积不能超过20,如果长设定为5的情况下,那么在设定宽的时候,就会校验其不能大于4;
二、建造者模式
2.1 模式说明
将一个复杂对象的构建与它的表示分离,使得同样的构建过程,不同的构建顺序可以创建不同的表示。
图 建造者模式
2.2 代码实现
public class Goods {
/**
* 商品类别 0 普通商品 1 虚拟商品
*/
private int type;
/**
* 名称
*/
private String name;
/**
* 重量
*/
private double weight;
/**
* 网址
*/
private String url;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "Goods{" +
"type=" + type +
", name='" + name + '\'' +
", weight=" + weight +
", url='" + url + '\'' +
'}';
}
}
public abstract class Builder {
private Goods goods = new Goods();
public abstract void buildName(String name);
public abstract void buildWeight(double weight);
public abstract void buildUrl(String url);
public Goods getGoods() {
return goods;
}
}
public class OrdinaryBuilder extends Builder {
@Override
public void buildName(String name) {
this.getGoods().setName(name);
}
@Override
public void buildWeight(double weight) {
this.getGoods().setType(0);
this.getGoods().setWeight(weight);
}
@Override
public void buildUrl(String url) {
}
}
public class VirtualBuilder extends Builder{
@Override
public void buildName(String name) {
this.getGoods().setName(name);
}
@Override
public void buildWeight(double weight) {
}
@Override
public void buildUrl(String url) {
this.getGoods().setType(1);
this.getGoods().setUrl(url);
}
}
public class Shop {
public static void main(String[] args) {
Builder ordinaryBuilder = new OrdinaryBuilder();
Builder virtualBuilder = new VirtualBuilder();
//创建一般商品
ordinaryBuilder.buildName("大西瓜");
ordinaryBuilder.buildWeight(300);
System.out.println(ordinaryBuilder.getGoods());
//创建虚拟商品
virtualBuilder.buildName("你懂得的网站");
virtualBuilder.buildUrl("https://baidu.com");
System.out.println(virtualBuilder.getGoods());
}
}
2.3 优缺点
优点:1)扩展性好,各个具体的建造者相互独立,有利于系统的解耦;2)建造者可以对创建过程逐步细化,而不对其他模块产生任何影响;3)客户端可不必知道产品内部的组成细节
缺点:1)要求创建的产品具有较多的共同点、组成部分相似;2)如果产品内部变化复杂,可能需要定义很多具体建造者类来实现这种变化,会使系统变得很庞大;