适用于某个对象构造过程复杂的情况,实现了构建和装配的解耦。主要包含builder和Director。常见应用场景:StringBuilder中append方法,sql中preparedStatement。
下面看一个具体的场景:比如我要构造一个台灯,需要以下几部分组成:灯泡、支架、底座。
台灯类:
public class DeskLamp {
private Bulb bulb;
private Bracket bracket;
private Base base;
public DeskLamp(Bulb bulb, Bracket bracket, Base base) {
this.bulb = bulb;
this.bracket = bracket;
this.base = base;
}
public Bulb getBulb() {
return bulb;
}
public void setBulb(Bulb bulb) {
this.bulb = bulb;
}
public Bracket getBracket() {
return bracket;
}
public void setBracket(Bracket bracket) {
this.bracket = bracket;
}
public Base getBase() {
return base;
}
public void setBase(Base base) {
this.base = base;
}
}
//灯泡类
class Bulb{
private String name;
public Bulb(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//支架类
class Bracket{
private String name;
public Bracket(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//底座类
class Base{
private String name;
public Base(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
台灯Builder接口
public interface DeskLampBuilder {
Bulb buildBulb();
Bracket buildBracket();
Base buildBase();
}
晨光牌台灯类
public class chenguangBuilder implements DeskLampBuilder {
@Override
public Bulb buildBulb() {
System.out.println("构建灯泡");
//这里可以和工厂模式结合起来
return new Bulb("晨光");
}
@Override
public Bracket buildBracket() {
System.out.println("构建支架");
return new Bracket("晨光");
}
@Override
public Base buildBase() {
System.out.println("构建底座");
return new Base("晨光");
}
}
台灯Director
public interface Director {
DeskLamp directDeskLamp();
}
具体Director类
public class DeskLampDirector implements Director {
//持有builder对象
private DeskLampBuilder builder;
public DeskLampDirector(DeskLampBuilder builder) {
this.builder = builder;
}
@Override
public DeskLamp directDeskLamp() {
Base base = builder.buildBase();
Bracket bracket = builder.buildBracket();
Bulb bulb = builder.buildBulb();
return new DeskLamp(bulb,bracket,base);
}
}
测试类
public class Test {
public static void main(String[] args) {
Director director = new DeskLampDirector(new chenguangBuilder());
DeskLamp deskLamp = director.directDeskLamp();
System.out.println(deskLamp.getBulb());
}
}
最后的输出结果如下:
构建底座
构建支架
构建灯泡
build.Bulb@4554617c