一、概述
建造者模式又叫生成器模式,是一种对象构建模式。目的将产品和产品建造过程解耦。
二、角色
-
产品:描述一个由一些列部件组成较为复杂的对象
-
抽象建造者:描述具体建造者的公共接口,一般用来定义建造细节的方法,并不涉及具体的对象部件的创建
-
具体建造者:描述具体建造者,并实现抽象建造者公共接口
-
指挥者:调用具体建造者来创建对象(产品)的各个部分,并按照一定顺序(流程)来建造复杂对象
三、栗子
1.有序装配构造
通过Client,Director,Builder,Product形成的建造者模式
1) 产品(房子)
public class Product {
private String basic;
private String wall;
private String roof;
// set、get方法、toString方法
}
2) 抽象建造者
public interface Builder {
// 地基
void buildBasic();
// 墙
void buildWalls();
// 房顶
void buildRoof();
// 完工-获取产品
Product getProduct();
}
3) 具体建造者
public class ConcreteBuilder implements Builder {
private Product product;
public ConcreteBuilder() {
product = new Product();
}
@Override
public void buildBasic() {
product.setBasic("地基");
}
@Override
public void buildWalls() {
product.setWall("墙");
}
@Override
public void buildRoof() {
product.setRoof("房顶");
}
@Override
public Product getProduct() {
return product;
}
}
4) 指挥者
public class Director {
// 指挥工人按顺序造房
public Product create(Builder builder) {
builder.buildBasic();
builder.buildWalls();
builder.buildRoof();
return builder.getProduct();
}
}
5) 测试
@Test
public void testBuilder1() {
Director director = new Director();
Product product = director.create(new ConcreteBuilder());
System.out.println(product);
}
2.无序装配构造
通过静态内部类方式实现零件无序装配构造
抽象建造者,具体建造者,产品,比第一种方式少了指挥者,主要是因为第二种方式把指挥者交给用户来操作,使得产品的创建更加简单灵活
1) 产品(肯德基)
public class Product {
private String drink;
private String snack;
// set、get方法、toString方法
}
2) 抽象建造者
public interface Builder {
// 饮料
Builder buildDrink(String drink);
// 小吃
Builder buildSnack(String snack);
// 获取套餐
Product build();
}
3) 具体建造者(服务员)
public class ConcreteBuilder implements Builder {
private Product product;
public ConcreteBuilder() {
product = new Product();
}
@Override
public Builder buildDrink(String drink) {
product.setDrink(drink);
return this;
}
@Override
public Builder buildSnack(String snack) {
product.setSnack(snack);
return this;
}
@Override
public Product build() {
return product;
}
}
4) 测试
@Test
public void testBuilder2() {
ConcreteBuilder concreteBuilder = new ConcreteBuilder();
Product product = concreteBuilder.buildDrink("可乐")
.buildSnack("薯条")
.build();
System.out.println(product);
}