简介
建造者模式(Builder Pattern),也称生成器模式。使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
或者说将一个复杂对象的构建与它的表示分离、使得同样的构建过程可以创建不同的表示。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
介绍
优点:
- 建造者独立,容易扩展。
- 便于控制细节风险。
- 封装性
缺点:
- 产品必须有共同点,范围有限制。
- 如内部变化复杂,会有很多的建造类。
注意:建造者模式关注的是零件类型和装配的工艺,这是它与工厂方法模式最大不同的地方
通用类图
例如:
引用菜鸟教程的例子:
我们假设一个快餐店的商业案例,其中,一个典型的套餐可以是一个汉堡(Burger)和一杯冷饮(Cold drink)。汉堡(Burger)可以是素食汉堡(Veg Burger)或鸡肉汉堡(Chicken Burger),它们是包在纸盒中。冷饮(Cold drink)可以是可口可乐(coke)或百事可乐(pepsi),它们是装在瓶子中。我们将创建一个表示食物条目(比如汉堡和冷饮)的 Item 接口和实现 Item 接口的实体类,以及一个表示食物包装的 Packing 接口和实现 Packing 接口的实体类,汉堡是包在纸盒中,冷饮是装在瓶子中。
然后我们创建一个 Meal 类,带有 Item 的 ArrayList 和一个通过结合 Item 来创建不同类型的 Meal 对象的 MealBuilder。BuilderPatternDemo,我们的演示类使用 MealBuilder 来创建一个 Meal。
http://www.runoob.com/design-pattern/builder-pattern.html
画出类图:
java实现
创建表示食物和食物包装的接口:
public interface Item {
String name();
String packing();
float price();
}
public interface Packing {
String pack();
}
将食物类设置为抽象,并实现item接口
public abstract class Burger implements Item {
public Packing packing() {
//汉堡使用的是纸包装
return new Wrapper();
}
public abstract float price();
}
public abstract class Drink implements Item {
public Packing packing() {
//饮料使用的是瓶子包装
return new Bottle();
}
public abstract float price();
}
创建包装的实现类
public class Wrapper implements Packing {
public String pack() {
return "Wrapper";
}
}
public class Bottle implements Packing {
public String pack() {
return "Bottle";
}
}
创建各类食品的实现类
public class ChickenBurger extends Burger {
@Override
public String name() {
return "ChickenBurger";
}
@Override
public float price() {
return 151.23f;
}
}
public class VegBurger extends Burger {
@Override
public String name() {
return "VegBurger";
}
@Override
public float price() {
return 23.13f;
}
}
public class Coke extends Drink {
@Override
public String name() {
return "Coke";
}
@Override
public float price() {
return 15.23f;
}
}
public class Pepsi extends Drink {
@Override
public String name() {
return "Pepsi";
}
@Override
public float price() {
return 23.65f;
}
}
Meal类
public class Meal {
private List<Item> items = new ArrayList<Item>();
public void addItem(Item item) {
items.add(item);
}
public float getCost() {
float cost = 0;
for (Item i : items) {
cost+=i.price();
}
return cost;
}
public void showItem() {
for (Item item : items){
System.out.println(item.name()+"=="+item.packing().pack()+"=="+item.price());
}
}
}
MealBuilder类:负责Meal的创建
public class MealBuilder {
public Meal builderVegMeal() {
Meal meal = new Meal();
meal.addItem(new VegBurger());
meal.addItem(new Coke());
return meal;
}
public Meal builderChickMeal() {
Meal meal = new Meal();
meal.addItem(new ChickenBurger());
meal.addItem(new Pepsi());
return meal;
}
}
场景类
public class BuliderPatternDemo {
public static void main(String[] args){
MealBuilder mealBuilder = new MealBuilder();
Meal meal = mealBuilder.builderChickMeal();
meal.showItem();
meal.getCost();
System.out.println("========");
Meal meal1 = mealBuilder.builderVegMeal();
meal1.showItem();
meal1.getCost();
}
}