设计模式-建造者模式
# 设计模式-建造者模式
建造者模式: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
就好比我们装修房间,房间有很多不同组件去搭建。现在我们并不关心每个组件是如何装修的,而是关心房间整体。所以这时候我们只需要找一个设计师来设计房间(指挥者),然后这个指挥者给不同组件指定对应的建造者进行创建。
通过这种方式我们就把这个复杂的房间拆分成各个部分,各个部分由对应的建造者去建设。
使用环境:
如果创建复杂对象并希望系统具备很好的灵活性和可扩展性可以考虑使用建造者模式。
优点:
建造者独立,易扩展。
便于控制细节风险。
缺点:
- 需要生成的对象具有复杂的内部结构。
- 需要生成的对象内部属性本身相互依赖。
与生产者模式的区别在于:建造者模式更加关注与零件装配的顺序
# 案例
食物抽象类:
public interface Item {
/**
* 名称
* @return String
*/
public String name();
/**
* 打包方式
* @return String
*/
public Packing packing();
/**
* 单价
* @return String
*/
public float price();
}
包装抽象类:
public interface Packing {
/**
* 包装方式
* @return String
*/
public String pack();
}
包装具体实现:
public class Bottle implements Packing{
@Override
public String pack() {
return "瓶装";
}
}
public class Wrapper implements Packing {
@Override
public String pack() {
return "纸包装";
}
}
汉堡抽象类:
public abstract class Burger implements Item {
@Override
public Packing packing() {
return new Wrapper();
}
/**
* 汉堡的价格
* @return
*/
@Override
public abstract float price();
}
冷饮抽象类:
public abstract class ColdDrink implements Item {
@Override
public Packing packing() {
return new Bottle();
}
/**
* 冰镇水价格
* @return
*/
@Override
public abstract float price();
}
鸡肉堡实现类:
public class ChickenBurger extends Burger {
@Override
public float price() {
return 50.5f;
}
@Override
public String name() {
return "鸡肉堡";
}
}
可乐实现类:
public class Coke extends ColdDrink {
@Override
public float price() {
return 30.0f;
}
@Override
public String name() {
return "可乐";
}
}
食物建造者:
public class MealBuilder {
/**
* 准备饮料
* @return
*/
public Meal prepareDrink() {
Meal meal = new Meal();
meal.addItem(new Coke());
return meal;
}
/**
* 准备汉堡
* @return
*/
public Meal prepareBurger() {
Meal meal = new Meal();
meal.addItem(new ChickenBurger());
return meal;
}
}
具体实现:
public class BuilderPatternDemo {
public static void main(String[] args) {
MealBuilder mealBuilder = new MealBuilder();
Meal vegMeal = mealBuilder.prepareDrink();
System.out.println("Drink");
vegMeal.showItems();
System.out.println("Total Cost: " +vegMeal.getCost());
Meal nonVegMeal = mealBuilder.prepareBurger();
System.out.println("\n\nBurger");
nonVegMeal.showItems();
System.out.println("Total Cost: " +nonVegMeal.getCost());
}
}
可以感受到整个过程和工厂模式十分相似,只是在细化组件内部的过程中建造者模式更为方便。
# 参考
上次更新: 2024/06/29, 15:13:44