建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
建造者实用范围
当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
当构造过程必须允许被构造的对象有不同表示时。
建造者主要解决
主要解决在软件系统中,有时候面临着 ” 一个复杂对象 ” 的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定
定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
使用场景
通过上面的定义我们大概已经知道创建模式它是要做什么了
- 相同的方法,不同的执行顺序,产生不同的事件结果时
- 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时
- 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适
- 当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时
建造者实现
- 客户
客户提出的需求,比如我想要什么,我需要什么样的,这个我得告诉有这个东西的人对吧或是可以建造的人,那现在客户说了我需要建造一个房子,下面是我们的客户需求码
class Product {constructor () {
this.bedroom = ''this.living =''
this.kitchen =''
}
}
上面的代码我创建了一个 Product 类,里面产生了一个卧室的空间变量 bedroom
,一个客厅living
的空间,一个厨房 kitchen
的空间
- 抽象建造者类
我们需要找到它们共同的本质,从而写一个属于卧室,客厅,厨房的抽象类函数,那么抽象是什么:从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。
总的来说我绝绝的它们是虚无缥缈的东西,需要你自己的思维去想去思考,当然每个人的思考方式,思考的点不同抽象出的本质就不一样
class house {build () {console.log('建造')
}
}
上面的代码是我们编写一个简单的房子类,我们在这里抽离的本质是它的建造,俗话说就是盖的那种,你懂得~
简单举例:
本质:运动
事物具体的实现:跑步,游泳
本质:射击
事物具体的实现:手枪射击,步枪射击
本质:行驶
事物具体的实现:宝马行驶,奔驰行驶
- 具体的建造类
就是我们要具体怎么建造卧室
bedroom
,客厅living
,厨房kitchen
我们要具体的去实现客户想要的东西
// 卧室的建造类型
class Bedroom extends house {build () {console.log('建造卧室')
}
}
// 客厅的建造类
class Living extends house {build () {console.log('建造客厅')
}
}
// 厨房的建造类
class Kitchen extends house {build () {console.log('建造厨房')
}
}
上面的代码就是我们实现三个不同风格的房子代码实现
- 指挥官类
这个大家应该可以想象的到它是要干什么吧,就正如我们平常去工地打工建造房子,每个队伍肯定有一个包工头吧,或者是这个房子项目的经理工程师之类,它们肯定每天都会给你们布置任务,今天要完成什么,用什么机器或者是摸具,或者是哪些大型工具什么的
// 指挥创建用户所需房子
class Command {construct (build) {build.build()
}
}
上面则是我们的指挥官类,每个需要创建的房子都要通过它的指挥去完成,没有它是不行的,这样我们也可以达到解耦的效果
代码组合实现
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script>
// 用户我需要一个房子
class Product {constructor () {
this.bedroom = ''this.living =''
this.kitchen =''
}
}
// 指挥创建用户所需房子
class Command {construct (build) {build.build()
}
}
/**
* 创建房子的抽象接口
*/
class house {build () {console.log('建造')
}
}
/**
* 具体的建造
*/
class Bedroom extends house {build () {console.log('建造卧室')
}
}
class Living extends house {build () {console.log('建造客厅')
}
}
class Kitchen extends house {build () {console.log('建造厨房')
}
}
// 最终产品
class done extends house {success (product) {
this.product = product
this.product.bedroom = '卧室已建造完毕'
this.product.living = '客厅已建造完毕'
this.product.kitchen = '厨房已建造完毕'
return this.product
}
}
// 使用者
let newBedroom = new Bedroom()
let newLiving = new Living()
// 指挥者类指挥
let newCommand = new Command()
// 建造卧室
newCommand.construct(newBedroom)
// 建造客厅
newCommand.construct(newLiving)
// 组装产品
let Assemble = new Product()
// 建造了一个产品
console.log(new done().success(Assemble))
</script>
</html>
上面我们的代码中多了一个最终产品完成类,主要就是体现通过我们的一系列创建我们完成了哪些东西,也可以依据这些东西再去处理我们的逻辑,以及进行扩展等。
我们首先new
一个卧室的构造函数,一个客厅的构造函数,继续new
指挥官newCommand
构造函数用来指挥创建,newCommand.construct(newBedroom)
建造卧室,newCommand.construct(newLiving)
建造客厅,通过组装最终产品类提交完成报告。
建造者模式我们今天就讲到这里了,具体的实现以及大概的代码我都已经给大家展示了。
参考:建造者
创建型设计模式之 Builder 模式