定义
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
角色
抽象建造者(Builder):抽象的建造者,为创建一个产品对象的各个部件指定抽象接口。
具体的建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并提供一个检索产品的接口。
指挥者(Director):构造一个使用Builder接口的对象。指挥者类Director,该类的作用主要有两个:一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。指挥者针对抽象建造者编程,客户端只需要知道具体建造者的类型,即可通过指挥者类调用建造者的相关方法,返回一个完整的产品对象。
具体产品(Product):表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
与工厂模式的区别
建造者模式与工厂模式的区别:
工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。
建造者模式也是创建一个产品,但是不仅要把这个产品创建出来,还要关系这个产品的组成细节,组成过程。从代码上看,建造者模式在建造产品时,这个产品有很多方法,建造者模式会根据这些相同方法但是不同执行顺序建造出不同组成细节的产品。
实例
具体产品类(Product)
public class Shoes {
//设计图纸
private String designDrawings;
//鞋底
private String sole;
//鞋身
private String shoeBody;
//鞋带
private String shoelace;
//鞋垫
private String insole;
public Shoes() {
}
public Shoes(String designDrawings, String sole, String shoeBody, String shoelace, String insole) {
this.designDrawings = designDrawings;
this.sole = sole;
this.shoeBody = shoeBody;
this.shoelace = shoelace;
this.insole = insole;
}
public String getDesignDrawings() {
return designDrawings;
}
public void setDesignDrawings(String designDrawings) {
this.designDrawings = designDrawings;
}
public String getSole() {
return sole;
}
public void setSole(String sole) {
this.sole = sole;
}
public String getShoeBody() {
return shoeBody;
}
public void setShoeBody(String shoeBody) {
this.shoeBody = shoeBody;
}
public String getShoelace() {
return shoelace;
}
public void setShoelace(String shoelace) {
this.shoelace = shoelace;
}
public String getInsole() {
return insole;
}
public void setInsole(String insole) {
this.insole = insole;
}
@Override
public String toString() {
return "Shoes{" +
"designDrawings='" + designDrawings + '\'' +
", sole='" + sole + '\'' +
", shoeBody='" + shoeBody + '\'' +
", shoelace='" + shoelace + '\'' +
", insole='" + insole + '\'' +
'}';
}
}
抽象建造者(Builder)
public abstract class ShoesBuilder {
Shoes shoes = new Shoes();
public abstract void setDesignDrawings(String designDrawings);
public abstract void setSole(String sole);
public abstract void setShoeBody(String shoeBody);
public abstract void setShoelace(String shoelace);
public abstract void setInsole(String insole);
Shoes createShoes() {
return shoes;
}
}
具体的建造者(ConcreteBuilder)
//跑鞋建造者
public class RunShoesBuilder extends ShoesBuilder {
@Override
public void setDesignDrawings(String designDrawings) {
shoes.setDesignDrawings(designDrawings);
System.out.println("跑鞋设计图纸");
}
@Override
public void setSole(String sole) {
shoes.setSole(sole);
System.out.println("跑鞋鞋底");
}
@Override
public void setShoeBody(String shoeBody) {
shoes.setShoeBody(shoeBody);
System.out.println("跑鞋鞋身");
}
@Override
public void setShoelace(String shoelace) {
shoes.setShoelace(shoelace);
System.out.println("跑鞋鞋带");
}
@Override
public void setInsole(String insole) {
shoes.setInsole(insole);
System.out.println("跑鞋鞋垫");
}
}
//休闲鞋建造者
public class LeisureShoesBuilder extends ShoesBuilder {
@Override
public void setDesignDrawings(String designDrawings) {
shoes.setDesignDrawings(designDrawings);
System.out.println("休闲鞋设计图纸");
}
@Override
public void setSole(String sole) {
shoes.setSole(sole);
System.out.println("休闲鞋鞋底");
}
@Override
public void setShoeBody(String shoeBody) {
shoes.setShoeBody(shoeBody);
System.out.println("休闲鞋鞋身");
}
@Override
public void setShoelace(String shoelace) {
shoes.setShoelace(shoelace);
System.out.println("休闲鞋鞋带");
}
@Override
public void setInsole(String insole) {
shoes.setInsole(insole);
System.out.println("休闲鞋鞋垫");
}
}
指挥者(Director)
public class ShoesDirector {
public Shoes directRunShoes(RunShoesBuilder shoesBuilder){
shoesBuilder.setDesignDrawings("跑鞋设计图纸");
shoesBuilder.setSole("跑鞋鞋底");
shoesBuilder.setShoeBody("跑鞋鞋身");
shoesBuilder.setShoelace("跑鞋鞋带");
shoesBuilder.setInsole("跑鞋鞋垫");
return shoesBuilder.createShoes();
}
public Shoes directLeisureShoes(LeisureShoesBuilder shoesBuilder){
shoesBuilder.setDesignDrawings("休闲鞋设计图纸");
shoesBuilder.setSole("休闲鞋鞋底");
shoesBuilder.setShoeBody("休闲鞋鞋身");
shoesBuilder.setShoelace("休闲鞋鞋带");
shoesBuilder.setInsole("休闲鞋鞋垫");
return shoesBuilder.createShoes();
}
}
测试类:
public class BuilderTest {
public static void main(String[] args) {
RunShoesDirector runShoesDirector = new RunShoesDirector();
runShoesDirector.directRunShoes(new RunShoesBuilder());
runShoesDirector.directLeisureShoes(new LeisureShoesBuilder());
}
}