CSDN话题挑战赛第2期
参赛话题:学习笔记
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?
建造者模式
把一个复杂对象的分离层和表示层分离,同样的构建过程可以采用不同的表示
应用场景
当一个构造函数的参数较多时使用,根据参数进行分类然后分别构建各个部分,最后挂载到对象的属性上。
实例:候选人
候选人对象具有人的基础属性,例如:姓名、年龄等,除了基础属性外还有工作属性。
工作属性还有其他的属性,例如:工作名称、种类、描述等。
为了简化候选人的构造,将其基础属性和工作属性分开,分别构建。以后需要扩展时也可以分别扩展互不影响。
function Candidate(param) {
let _candidate = new Person(param);
_candidate.work = new CreatedWork(param.work);
return _candidate;
}
function Person(param) {
this.name = param.name;
this.age = param.age;
}
function CreatedWork(work) {
switch (work) {
case 'engineer':
this.name = '工程师';
this.description = '热爱编程';
break;
case 'teacher':
this.name = '老师';
this.description = '乐于分享';
break;
default:
this.name = param.work;
this.description = '无';
break;
}
}
CreatedWork.prototype.changeWork = function (work) {
this.name = work;
}
CreatedWork.prototype.changeDes = function (des) {
this.description = des;
}
优缺点
优点
- 建造者模式的封装性很好:使用建造者模式可以有效地封装变化,在使用建造者模式的场景中,一般产品和建造这类是比较稳定的,因此,将主要的业务逻辑封装在指挥者类中对整体而言,可以取得较好的稳定性
- 在建造者模式中,客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程结构,使得相同的创建过程可以创建不同的产品对象
- 可以更加精细地控制产品的创建过程:将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更加方便使用程序来控制创建过程
- 建造者模式很容易进行扩展:如果有新的需求,通过实现一个新的建造这类就可以完成,基本上不用修改之前已经测试通过的代码,因此也就不会对原有功能引入风险,符合开闭原则
缺点
建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制