建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
当你的需求中有很对不变的基础设施,但是又有很多变化的组合时,就用这种模式:一些基本部件不会变,而其组合经常变化的时候。
优点:
- 建造者独立,易扩展。
- 便于控制细节风险。
缺点:
- 产品必须有共同点,范围有限制。
- 如内部变化复杂,会有很多的建造类。
使用场景:
- 需要生成的对象具有复杂的内部结构。
- 需要生成的对象内部属性本身相互依赖。
注意事项:
与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
示例展示
如:KFC的套餐,你每天出门的穿着搭配,JAVA 中的 StringBuilder。
KFC点餐:
Meal 包含 主食和饮料
Food包含名称、价格、包装
主食:(盒装)
汉堡:鸡肉汉堡和蔬菜汉堡
饮料:(瓶装)
咖啡、牛奶、果汁
包装的接口和实现:
interface Packing {
fun pack(): String
}
class Bottle : Packing {
override fun pack(): String {
return "Bottle"
}
}
class Wrapper : Packing {
override fun pack(): String {
return "Wrapper"
}
}
实物的抽象
interface Item {
fun Name(): String
fun Pack(): Packing
fun Price(): Float
}
汉堡的抽象和实现
//item HanBurger,Drink
interface Burger : Item {
override fun Pack(): Packing {
return Wrapper()
}
}
class VeggieBurger : Burger {
override fun Name(): String {
return "VeggieBurger"
}
override fun Price(): Float {
return 15.9f
}
}
class ChickenBurger : Burger {
override fun Name(): String {
return "ChickenBurger"
}
override fun Price(): Float {
return 25.9f
}
}
饮料的抽象和实现
///Coffee Orange Juice milk
interface Drink : Item {
override fun Pack(): Packing {
return Bottle()
}
}
class Coffee : Drink {
override fun Name(): String {
return "Coffee"
}
override fun Price(): Float {
return 10f
}
}
class OrangeJuice : Drink {
override fun Name(): String {
return "Orange Juice"
}
override fun Price(): Float {
return 13.5f
}
}
class Milk : Drink {
override fun Name(): String {
return "Milk"
}
override fun Price(): Float {
return 18f
}
}
Meal点餐的先实现
//
class KFCMeal {
private var items: ArrayList<Item> = ArrayList()
fun addItem(item: Item) {
items.add(item)
}
fun getPrice(): Float {
var price: Float = 0.0f
for (it in items) {
price += it.Price()
}
return price
}
fun showItems() {
for (it in items) {
Log.e("showItems","showItems"+it.Name())
}
}
}
建造者的实现
class KFCBuilder {
fun prepareVegCoffeeMeal(): KFCMeal {
val kfcMeal: KFCMeal = KFCMeal()
kfcMeal.addItem(VeggieBurger())
kfcMeal.addItem(Coffee())
return kfcMeal
}
fun prepareVegJuiceMeal(): KFCMeal {
val kfcMeal: KFCMeal = KFCMeal()
kfcMeal.addItem(VeggieBurger())
kfcMeal.addItem(OrangeJuice())
return kfcMeal
}
fun prepareChickenCoffeeMeal(): KFCMeal {
val kfcMeal: KFCMeal = KFCMeal()
kfcMeal.addItem(ChickenBurger())
kfcMeal.addItem(Coffee())
return kfcMeal
}
fun prepareChickenJuiceMeal(): KFCMeal {
val kfcMeal: KFCMeal = KFCMeal()
kfcMeal.addItem(ChickenBurger())
kfcMeal.addItem(OrangeJuice())
return kfcMeal
}
}
使用建造者,点餐
KFCBuilder builder = new KFCBuilder();
KFCMeal ccmeal= builder.prepareChickenCoffeeMeal();
ccmeal.showItems();
KFCMeal vjmeal=builder.prepareVegJuiceMeal();
vjmeal.showItems();
结果: