背景:小王去商城购买一台组装的台式机。
执行过程
1、电脑商城的老板(Director)向小王询问需求。(打游戏、办公or学习)
2、了解了小王的需求以后,电脑城的老板将小王的需求划分为各个部件(Builder)的需求。(CPU、Memory、HD)
3、指挥装机人员(ConcreteBuilder)去构建组件
4、将组件组装成小王需要的电脑(Computer)
package 设计模式2
/**
*@Description
*@Author PC
*@QQ 1578684787
*/
/**
* 需要build的对象Computer
*/
class Computer(){
//存储组装的电脑
var parts:MutableList<String> = ArrayList()
//添加电脑组件
fun addComputerPart(part:String){
parts.add(part)
}
//显示电脑的配置
fun show(){
println("Computer的配置:")
parts.forEach {
println(it+"")
}
}
}
/**
* 抽象的Builder:抽象出定义组装电脑的过程
*/
abstract class Builder{
//1、组装过程
//第一步:装CPU
abstract fun buildCPU()
//第二步:装内存
abstract fun buildMemory()
//第三部:装硬盘
abstract fun builderHD()
//2、返回组装的结果
abstract fun create():Computer
}
/**
* 具体的Builder:组装员
*/
class ConcertBuilder():Builder(){
//待build的对象
private val computer = Computer()
override fun buildCPU() {
computer.parts.add("Intel-CPU")
}
override fun buildMemory() {
computer.parts.add("三星-Memory")
}
override fun builderHD() {
computer.parts.add("希捷-硬盘")
}
override fun create(): Computer {
return computer
}
}
/**
* 老板:Director
*/
object Director{
//让装机员装机
fun splice(builder: Builder){
builder.apply {
this.buildCPU()
this.buildMemory()
this.builderHD()
}
}
}
/**
* 测试
*/
fun main() {
//找到装机人员
val builder = ConcertBuilder()
//老板让组装人员装机
Director.splice(builder)
//获取组装完毕的电脑
val computer = builder.create()
//显示电脑的信息
computer.show()
}
测试结果
执行结果
优点
- 易于解耦:将产品与产品创建过程进行解耦,可以使用相同的创建过程来得到不同的产品。也就是说细节依赖抽象。
- 易于精确控制对象的创建:将复杂产品的创建不走分解在不同的方法中,使得创建过程更加清晰。
- 易于扩展:增加新的具体建造者无需修改原有类库的代码,已与扩展,符合“开闭原则”。
缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
应用场景
Android中的AltertDialog就是使用了建造者模式来构建AlertDialog。
- 需要生成的产品对象又复杂的内部结构,这些产品对象具备共性;
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。
参考文章:
Android设计模式-建造者模式
网友评论