美文网首页我爱编程
(Kotlin and Java)设计模式-建造者模式

(Kotlin and Java)设计模式-建造者模式

作者: SYfarming | 来源:发表于2018-06-11 10:27 被阅读93次

    以最简单的module学习设计模式

    设计模式持续更新中:https://www.jianshu.com/p/e3c25095c31f

    前言

    建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

    主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

    何时使用:一些基本部件不会变,而其组合经常变化的时候。

    正文

    1. 指挥者(Director)直接和客户(Client)进行需求沟通;
    2. 沟通后指挥者将客户创建产品的需求划分为各个部件的建造请求(Builder);
    3. 将各个部件的建造请求委派到具体的建造者(ConcreteBuilder);
    4. 各个具体建造者负责进行产品部件的构建;
    5. 最终构建成具体产品(Product)。

    建造模式很简单,一组装电脑为例,由于电脑元件一般不会发生太大的改变,但电脑组装是一个复杂的过程。
    UML图:



    1.创建建造请求

    
    abstract class Builder {
        //第一步:装CPU
        //声明为抽象方法,具体由子类实现
        abstract fun buildCPU()
    
        //第二步:装主板
        //声明为抽象方法,具体由子类实现
        abstract fun buildMainboard()
    
        //第三步:装硬盘
        //声明为抽象方法,具体由子类实现
        abstract fun buildHD()
    
        //返回产品的方法:获得组装好的电脑
        abstract fun getComputer(): Computer
    }
    
    

    2.将建造请求委派到建造者进行实现

    class ConcreteBuilder : Builder() {
        //创建产品实例
        private var computer = Computer()
    
        //组装产品
        override fun buildCPU() {
            computer.add("组装CPU")
        }
    
        override fun buildMainboard() {
            computer.add("组装主板")
        }
    
        override fun buildHD() {
            computer.add("组装硬盘")
        }
    
        //返回组装成功的电脑
        override fun getComputer(): Computer {
            return computer
        }
    }
    

    3.指挥组装元件

    class Director {
        //指挥装机人员组装电脑
        fun construct(builder: Builder) {
    
            builder.buildCPU()
            builder.buildMainboard()
            builder.buildHD()
        }
    }
    

    4.定义具体产品类(Product):电脑

    
    class Computer {
        //电脑组件的集合
        private val parts = ArrayList<String>()
    
        //用于将组件组装到电脑里
        fun add(part: String) {
            parts.add(part)
        }
    
        fun show() {
            for (i in parts.indices) {
                println("组件" + parts[i] + "装好了")
            }
            println("电脑组装完成,请验收")
    
    
        }
    }
    

    客户端调用

    
    object BuilderTest {
        @JvmStatic
        fun main(args: Array<String>) {
    
            //逛了很久终于发现一家合适的电脑店
            //找到该店的老板和装机人员
            val director = Director()
            val builder = ConcreteBuilder()
            //沟通需求后,老板叫装机人员去装电脑
            director.construct(builder)
    
            //装完后,组装人员搬来组装好的电脑
            val computer = builder.getComputer()
            //组装人员展示电脑给小成看
            computer.show()
    
        }
    }
    

    结果输出


    每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。


    如果你对此感兴趣,可订阅(感谢你的关注):


    相关文章

      网友评论

        本文标题:(Kotlin and Java)设计模式-建造者模式

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