(Kotlin and Java)設計模式-建造者模式

以最簡單的module學習設計模式

前言

建造者模式:將一個複雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示

主要解決:主要解決在軟件系統中,有時候面臨着"一個複雜對象"的創建工作,其通常由各個部分的子對象用一定的算法構成;由於需求的變化,這個複雜對象的各個部分經常面臨着劇烈的變化,但是將它們組合在一起的算法卻相對穩定。

何時使用:一些基本部件不會變,而其組合經常變化的時候。

正文

  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()

    }
}

結果輸出

每一個具體建造者都相對獨立,而與其他的具體建造者無關,因此可以很方便地替換具體建造者或增加新的具體建造者,用戶使用不同的具體建造者即可得到不同的產品對象。 設計模式持續更新中

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章