前言

将一个复杂对象的构建层与表示层互相分离,同样的构建过程可采用不同的表示。
虽然建造者模式也是为了创建一个对象,但该模式更专注与对象的一个创建过程,而之前所习🉐️的工厂类模式则专注于结果,更关注是创建对象的细节
通过将对象的不同组成部分,交由每个不同的对象来实现,也可以说这种模式所创建出来的对象是一个复合对象
⚠️ 这种方式在无形中会增加对象的复杂性,因此如果对象的颗粒度很小的话,或者模块之间的复用率很低并且变动不大的话,优先采用创建一整个对象。

意图: 将一个复杂的构建与其表示分离,使得同样的构建过程可以创建不同的表示
主要解决: 主要解决在软件系统中,有时候面临一个”复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临剧烈变化,但将他们组合在一起的算法却相对稳定
何时使用: 一些基本不见不会变,而其组合经常变化的时候
应用实例: 去M记,汉堡、可乐、薯条、炸鸡等基本不变,而其组合是经常变化的,从而生成出所谓的”套餐”

ES5代码

1
2
3
4
5
6
7
8
9
10
11
 // Picture.js 抽象图片信息类,包含卡片信息、组合方式信息
function Picture(cardInfo, assembleInfo) {
this.cardInfo = cardInfo;
this.assembleInfo = assembleInfo;
}
Picture.prototype.getCardInfo = function (){
return this.cardInfo;
};
Picture.prototype.getAssembleInfo = function() {
return this.assembleInfo;
}
1
2
3
4
function CardInfo(type) {
var shapeArray = {triangle: '三角形', square: '正方形', diamond: '菱形', trapezoid: '梯形'};
this.shapeName = type ? shapeArray[type] ? shapeArray[type]: '不规则形状': '不规则形状';
}
1
2
3
4
function AssembleInfo(position) {
var positionArray = {center:'中间', leftTop: '左上', leftBottom: '左下', rightTop: '右上', rightBottom: '右下'};
this.position = position ? positionArray[position] ? positionArray[position] : '任意位置' : '任意位置';
}
1
2
3
4
5
6
7
// 组装对象属性方法
function NamePicture(cardInfo, assembleInfo) {
var picture = new Picture(cardInfo, assembleInfo);
picture.cardInfo = new CardInfo(cardInfo);
picture.assembleInfo = new AssembleInfo(assembleInfo);
return picture;
}
1
2
var flowers = new NamePicture('triangle', 'center');
console.info(flowers);

建造者模式结果

✨ 这里建造者模式关心的是如何组装Picture中的cardInfo以及assembleInfo属性,当然这里假如CardInfo比较复杂,那么可以根据之前的习得的工厂模式,将cardInfo属性交由工厂的实际例子去实现,因此会有
以下的一个工厂方法来生成不同的形状的CardInfo

1
2
3
4
5
6
7
function NamePicture(cardInfo, assembleInfo) {
var picture = new Picture(cardInfo, assembleInfo);
picture.cardInfo = CardInfoFactory(cardInfo);
picture.assembleInfo = AssembleInfoFactory(assembleInfo);
return picture;
}

优化后的ES6代码

暂无