UML类图
代码示例
- Product
/**
* 表示具体的产品,由多个部件组成
*/
public class Product {
/**
* 存放产品每个部件的集合
*/
private List<String> parts = new LinkedList<>();
/**
* 添加某一部件到该集合中
*
* @param part
*/
void addPart(String part) {
parts.add(part);
}
/**
* 展示产品的部件组成
*/
void show() {
parts.forEach(part -> System.out.print(part + " "));
}
}
- Builder
/**
* 抽象建造者,用于确定产品的组成及获取
*/
public interface Builder {
/**
* 部件A
*/
void partA();
/**
* 部件B
*/
void partB();
/**
* 获取产品
*
* @return
*/
Product getProduct();
}
- BuilderImpl
/**
* 具体建造者
*/
public class BuilderImpl implements Builder {
private Product product = new Product();
@Override
public void partA() {
product.addPart("部件A");
}
@Override
public void partB() {
product.addPart("部件B");
}
@Override
public Product getProduct() {
return product;
}
}
- Director
/**
* 指挥者类(控制建造流程)
*/
public class Director {
/**
* 控制并构造所需产品的最终形态
*
* @param builder
*/
void buildProduct(Builder builder) {
builder.partB();
builder.partA();
}
}
- 测试
public class Main {
public static void main(String[] args) {
// 指挥者
Director director = new Director();
Builder builder = new BuilderImpl();
// 指挥者调用所控制的建造过程
director.buildProduct(builder);
// 建造完成后返回最终产品
Product product = builder.getProduct();
// 调用展示
product.show();
}
}
总结思考
建造者模式中,一些基本部件的实现应该是不怎么变化的,它更关注于指挥者装配并组合部件的过程,对应生活中的KFC,汉堡、可乐、薯条等是不变的,而其组合是经常变化的,演变出各式各样的套餐。