美文网首页Kotlin开发指南Kotlin编程Kotlin
设计模式 (三)建造者模式

设计模式 (三)建造者模式

作者: Lost_Robot | 来源:发表于2017-07-11 15:53 被阅读45次

    建造者模式(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();
    

    结果:

    打印输出建造者建造的结果.png

    相关文章

      网友评论

        本文标题:设计模式 (三)建造者模式

        本文链接:https://www.haomeiwen.com/subject/arophxtx.html