建造者模式的核心是用多个简单对象一步一步构建一个复杂对象,也就是将一个复杂对象的构建和表示分离开来。
以快餐定套餐为例(套餐为复杂对象,套餐是由主食和饮料等多个简单对象构成的),代码如下:
先定义主食类和饮料类:
package BuilderPattern;
public class Food {
private String name;
private int price;
public Food(String name,int price){
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Food [name=" + name + ", price=" + price + "]";
}
}
package BuilderPattern;
public class Drink {
private String name;
private int price;
public Drink(String name,int price){
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Drink [name=" + name + ", price=" + price + "]";
}
}
再定义套餐类:
package BuilderPattern;
public class Meal {
private String name;
private Food food;
private Drink drink;
private int price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Food getFood() {
return food;
}
public void setFood(Food food) {
this.food = food;
}
public Drink getDrink() {
return drink;
}
public void setDrink(Drink drink) {
this.drink = drink;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
}
定义套餐Builder类:
package BuilderPattern;
public abstract class Builder {
protected Meal meal = new Meal();
public abstract void buildMealName();
public abstract void buildMealFood();
public abstract void buildMealDrink();
public abstract void buildMealPrice();
public Meal getMeal(){
return meal;
}
}
定义套餐A和套餐B的Builder类:
package BuilderPattern;
public class MealABuilder extends Builder {
@Override
public void buildMealName() {
// TODO Auto-generated method stub
super.meal.setName("套餐A");
}
@Override
public void buildMealFood() {
// TODO Auto-generated method stub
super.meal.setFood(new Food("鸡肉堡", 25));
}
@Override
public void buildMealDrink() {
// TODO Auto-generated method stub
super.meal.setDrink(new Drink("冰可乐", 12));
}
@Override
public void buildMealPrice() {
// TODO Auto-generated method stub
super.meal.setPrice(super.meal.getFood().getPrice() + super.meal.getDrink().getPrice());
}
}
package BuilderPattern;
public class MealBBuilder extends Builder {
@Override
public void buildMealName() {
// TODO Auto-generated method stub
super.meal.setName("套餐B");
}
@Override
public void buildMealFood() {
// TODO Auto-generated method stub
super.meal.setFood(new Food("牛肉煲", 28));
}
@Override
public void buildMealDrink() {
// TODO Auto-generated method stub
super.meal.setDrink(new Drink("热牛奶", 10));
}
@Override
public void buildMealPrice() {
// TODO Auto-generated method stub
super.meal.setPrice(super.meal.getFood().getPrice() + super.meal.getDrink().getPrice());
}
}
定义导演类:
package BuilderPattern;
public class Director{
public Meal getMeal(Builder builder){
Meal meal;
builder.buildMealName();
builder.buildMealFood();
builder.buildMealDrink();
builder.buildMealPrice();
meal = builder.getMeal();
return meal;
}
}
执行测试类:
package BuilderPattern;
public class RunDemo {
public static void main(String[] args) {
Builder builderA = new MealABuilder();
Director director = new Director();
Meal mealA = director.getMeal(builderA);
System.out.println(mealA.getName() + "***" + mealA.getFood().toString() + "***" + mealA.getDrink() + "***"
+ mealA.getPrice());
Builder builderB = new MealBBuilder();
Meal mealB = director.getMeal(builderB);
System.out.println(mealB.getName() + "***" + mealB.getFood().toString() + "***" + mealA.getDrink() + "***"
+ mealB.getPrice());
}
}
运行结果:
总结:个人觉得建造者模式最大的优点在于将复杂对象的创建和表现隔离开来。
建造者模式与抽象工厂模式的最大区别在于建造者模式通过导演类(Director)指定了复杂对象内部简单对象的创建步骤。
参考文档:设计模式|菜鸟教程,《设计模式之禅》,建造者模式(优快云)
上一篇:设计模式(五)——单例模式
下一篇:设计模式(七)——原型模式