更新
Builder模式的使用场景
- 相同的方法,不同的执行顺序,产生不同的事件结果(示例的场景);
- 多个部件或零件,都可以装配到一个对象中,但产生的运行结果又不相同;
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用,这个时候使用建造者模式非常适合;
- 当初始化一个对象非常复杂,如参数多,很多参数都具有默认值。
小结
Builder模式比较常见的实现形式是通过调用链实现,这样使代码更简洁、易懂。
优点
- 良好的封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
- 建造者独立,容易扩展。
缺点
- 会产生多余的Builder对象以及Director对象,消耗内存。
理论
定义
百度百科
java23种设计模式之一,英文叫Builder Pattern。其核心思想是将一个“复杂对象的构建算法”与它的“部件及组装方式”分离,使得构件算法和组装方式可以独立应对变化;复用同样的构建算法可以创建不同的表示,不同的构建过程可以复用相同的部件组装方式。
组成
- 产品(Product):是被构建的对象,是包含多个组件的复杂结构。
- 抽象建造者(Builder):为创建的产品对象规定抽象接口,一般包括两类方法,一类是创建组件的方法(以build开头),一类是返回创建的对象的方法。
- 具体建造者(ConcreteBuilder):实现建造者接口,实现各个部件的具体构造和装配方法。
- 导演者(Director):负责指挥复杂对象的构建次序。
示例
以我们东北好吃的饺子为例,包括饺子皮,饺子馅,饺子做法,和蘸料;可以做肉馅和素馅的饺子
序号 | 类名 | 角色 | 说明 |
---|---|---|---|
1 | JiaoZi | 产品 Product | 饺子 |
2 | JiaoZiBuilder | 抽象建造者 Builder | 饺子做法流程 |
3 | BuilderDirector | 导演者 Director | 厨师 |
4 | MeatJiaoZiBuilder | 具体建造者 ConcreteBuilder | 肉馅饺子做法 |
5 | VegetableJiaoZiBuilder | 具体建造者 ConcreteBuilder | 素馅饺子做法 |
6 | CustomMain | 客户端 | 食客(吃货) |
1.饺子类
public class JiaoZi {
//皮
private String skin;
//馅
private String stuffing;
//做法
private String practice;
//蘸料
private String dip;
public String getSkin() {
return skin;
}
public void setSkin(String skin) {
this.skin = skin;
}
public String getStuffing() {
return stuffing;
}
public void setStuffing(String stuffing) {
this.stuffing = stuffing;
}
public String getPractice() {
return practice;
}
public void setPractice(String practice) {
this.practice = practice;
}
public String getDip() {
return dip;
}
public void setDip(String dip) {
this.dip = dip;
}
@Override
public String toString() {
return "饺子{" +
"皮='" + skin + '\'' +
", 馅='" + stuffing + '\'' +
", 做法='" + practice + '\'' +
", 蘸料='" + dip + '\'' +
'}';
}
}
2.抽象建造者 Builder (饺子做法流程)
public interface JiaoZiBuilder {
void buildSkin();
void buildStuffing();
void buildPractice();
void buildDip();
JiaoZi buildJiaoZi();
}
3.导演者 Director(厨师)
public class BuilderDirector {
public BuilderDirector() {
}
public JiaoZi constructor(JiaoZiBuilder jiaoZiBuilder){
jiaoZiBuilder.buildSkin();
jiaoZiBuilder.buildStuffing();
jiaoZiBuilder.buildPractice();
jiaoZiBuilder.buildDip();
return jiaoZiBuilder.buildJiaoZi();
}
}
4.具体建造者 ConcreteBuilder(肉馅饺子做法)
public class MeatJiaoZiBuilder implements JiaoZiBuilder {
private JiaoZi jz = new JiaoZi();
@Override
public void buildSkin() {
jz.setSkin("白面");
}
@Override
public void buildStuffing() {
jz.setStuffing("猪肉芹菜");
}
@Override
public void buildPractice() {
jz.setPractice("水煮");
}
@Override
public void buildDip() {
jz.setDip("酱油");
}
@Override
public JiaoZi buildJiaoZi() {
return jz;
}
}
5.具体建造者 ConcreteBuilder(素馅饺子做法)
public class VegetableJiaoZiBuilder implements JiaoZiBuilder {
private JiaoZi jz = new JiaoZi();
@Override
public void buildSkin() {
jz.setSkin("白面");
}
@Override
public void buildStuffing() {
jz.setStuffing("酸菜粉条");
}
@Override
public void buildPractice() {
jz.setPractice("清蒸");
}
@Override
public void buildDip() {
jz.setDip("陈醋");
}
@Override
public JiaoZi buildJiaoZi() {
return jz;
}
}
6.客户端(吃货)
public class CustomMain {
public static void main(String[] args) {
//猪肉饺子
BuilderDirector director = new BuilderDirector();
JiaoZi meatJiaoZi = director.constructor(new MeatJiaoZiBuilder());
System.out.println(meatJiaoZi);
//酸菜饺子
JiaoZi vegetableJiaoZi = director.constructor(new VegetableJiaoZiBuilder());
System.out.println(vegetableJiaoZi);
}
}
网友评论