建造者模式与装饰器模式区别:
装饰器模式是针对相同的处理方案,添加额外装饰
建造者模式是针对固有的多种处理方式,选择性组合起来达成不同的结果
建造者模式的关键,是将复杂对象的构建过程与它本身的表示分离,使得同样的构建过程可以创建不同的表示
以饭店商品出单为例:
1. 先定义一个商品类
public class Product {
/**
* 套餐内容
*/
private ArrayList<String> parts = new ArrayList<String>();
public void add(String part) {
parts.add(part);
}
public void show() {
System.out.println(parts);
}
}
2. 使用抽象类定义出店家可供选择的商品
public abstract class ProductBuilder {
/**
* 米饭
*/
public abstract void rice();
/**
* 面条
*/
public abstract void noodle();
/**
* 饮料
*/
public abstract void drink();
/**
* 汤
*/
public abstract void soup();
/**
* 获取结果
* @return
*/
public abstract Product build();
}
3. 商品的具体实现(后厨)
public class ProductBuilderConcrete extends ProductBuilder {
private Product product = new Product();
/**
* 米饭
*/
@Override
public void rice() {
product.add("米饭");
}
/**
* 面条
*/
@Override
public void noodle() {
product.add("面条");
}
/**
* 饮料
*/
@Override
public void drink() {
product.add("饮料");
}
/**
* 汤
*/
@Override
public void soup() {
product.add("汤");
}
/**
* 获取结果
*
* @return
*/
@Override
public Product build() {
return product;
}
}
4. 商品选择搭配(套餐选择)
public class ProductDirectorOne {
private ProductBuilder builder;
public ProductDirectorOne(ProductBuilder builder) {
this.builder = builder;
}
public void construct() {
builder.drink();
builder.noodle();
}
}
public class ProductDirectorTwo {
private ProductBuilder builder;
public ProductDirectorTwo(ProductBuilder builder) {
this.builder = builder;
}
public void construct() {
builder.rice();
builder.soup();
}
}
5. 客户端下单
public class BuilderModeClient {
public static void main(String[] args) {
// 顾客一的搭配
customerOne();
// 顾客二的搭配
customerTwo();
}
private static void customerOne() {
// 取出菜单
ProductBuilder builder = new ProductBuilderConcrete();
// 选择套餐
ProductDirectorOne one = new ProductDirectorOne(builder);
one.construct();
// 交给后厨,准备上菜
Product product = builder.build();
product.show();
}
private static void customerTwo() {
// 取出菜单
ProductBuilder builder = new ProductBuilderConcrete();
// 选择套餐
ProductDirectorTwo two = new ProductDirectorTwo(builder);
two.construct();
// 交给后厨,准备上菜
Product product = builder.build();
product.show();
}
}