建造者模式使用多个简单的对象一步一步构建成一个复杂的对象。例如去肯德基,汉堡、可乐、炸鸡、薯条等是不会变,而其组合是经常变化的,生成出所谓的“套餐”,这种方式的优点是建造者独立,易扩展、便于控制细节风险。缺点是产品必须有共同点,范围有限制,如内部变化复杂,会有很多的建造类。这种模式与工厂模式的区别是:建造者模式更加关注与零件装配的顺序
例:
interface Item {
fun name(): String
fun Packing(): Packing
fun price(): Float
}
interface Packing {
fun pack(): String
}
class Wrapper : Packing{
override fun pack(): String {
return "Wrapper"
}
}
class Bottle: Packing{
override fun pack(): String {
return "Bottle"
}
}
abstract class Burger: Item{
override fun Packing(): Packing {
return Wrapper()
}
}
abstract class ColdDrink: Item{
override fun Packing(): Packing {
return Bottle()
}
}
class VegBurger: Burger() {
override fun name(): String {
return "Veg Burger"
}
override fun price(): Float {
return 25.0f
}
}
class ChickenBurger: Burger(){
override fun name(): String {
return "Chicken Burger"
}
override fun price(): Float {
return 50.0f
}
}
class Coke: ColdDrink(){
override fun name(): String {
return "Coke"
}
override fun price(): Float {
return 30.0f
}
}
class Pepsi: ColdDrink(){
override fun name(): String {
return "Pepsi"
}
override fun price(): Float {
return 35.0f
}
}
class Meal {
private var items: MutableList<Item> = mutableListOf()
fun addItem(item: Item){
items.add(item)
}
fun getCosat(): Float{
var cost = 0f
for(item in items){
cost += item.price()
}
return cost
}
fun showItems(){
for(item in items){
println("Item: ${item.name()},Packing: ${item.Packing().pack()},Price: ${item.price()}")
}
}
}
class MealBuilder{
fun prepareVegMeal(): Meal{
val meal = Meal()
meal.addItem(VegBurger())
meal.addItem(Coke())
return meal
}
fun prepareNonVegMeal(): Meal{
val meal = Meal()
meal.addItem(ChickenBurger())
meal.addItem(Pepsi())
return meal
}
}
fun main(){
val mealBuilder = MealBuilder()
val vegMeal = mealBuilder.prepareVegMeal()
vegMeal.showItems()
println(vegMeal.getCosat())
val nonMeal = mealBuilder.prepareNonVegMeal()
nonMeal.showItems()
println(nonMeal.getCosat())
}