以最简单的module学习设计模式
建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
建造模式很简单,一组装电脑为例,由于电脑元件一般不会发生太大的改变,但电脑组装是一个复杂的过程。 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()
}
}
结果输出
每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,用户使用不同的具体建造者即可得到不同的产品对象。 设计模式持续更新中