js常用设计模式实现(三)建造者模式
创建型模式
创建型模式是对一个类的实例化过程进行了抽象,把对象的创建和对象的使用进行了分离
关于创建型模式,已经接近尾声了,还剩下建造者模式和原型模式,这一篇说一说建造者模式
建造者模式的定义
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
很官方哈,举个例子,就拿他的名字来说,建房子,你尽管告诉开发商,我有钱我要一个这样的房子,然后开发商就会去找到工人,然后进行一些列的工作,最后工人干完之后,你住进去了,不关心过程,只要结果就是建造者模式
总之建造者模式就是通过一步步构建多个组成部分,直到构建一个对象
建造者模式实现
根据上边的例子来实现一下建造者
首先你的需求就是你需要一个你想要的房子,那么你肯定不能自己去建造,首先你会找到开发商
/**
* @author: 周靖松
* @information: 开发商
* @Date: 2019-07-14 10:11:54
*/
class Developer {
constructor() {
this.need = ['卧室', '厨房', '客厅'];
console.log("我需要这样的房间");
}
construct() {
console.log("开始建造");
let workerOk=this.need.map(el=>{
let builder = new CreatDiagram();
builder.build(el);
return builder.getResult();
})
console.log("房子不错");
console.log(workerOk);
}
}
// 要求产品
let home = new Developer();
// 生成产品
home.construct();
这是最终的目的,在我们new这个开发商类的时候,我们告诉他我们需要什么样的房子,需要有什么,然后开发商也不是自己去建造,他需要一个设计图,并且需要一些工人来帮助他实现建造
/**
* @author: 周靖松
* @information: 设计图抽象类
* @Date: 2019-07-14 10:11:10
*/
class Diagram {
constructor() {
console.log('拿到图纸')
}
build(partName) {
console.log(`观察${partName}图纸`);
}
}
/**
* @author: 周靖松
* @information: 设计图实现
* @Date: 2019-07-14 10:11:25
*/
class CreatDiagram extends Diagram {
constructor() {
super();
}
build(partName) {
super.build(partName);
console.log(`建造开始${partName}`);
this.worker = new worker(partName);
}
getResult() {
console.log('完工');
return this.worker;
}
}
ok 设计图到手,开始招人干活
/**
* @author: 周靖松
* @information: 工人类
* @Date: 2019-07-14 10:11:40
*/
class worker {
constructor(material) {
console.log(`我建造了${material}`);
this.data = material
}
}
最后放一下全部代码
/**
* @author: 周靖松
* @information: 设计图抽象类
* @Date: 2019-07-14 10:11:10
*/
class Diagram {
constructor() {
console.log('拿到图纸')
}
build(partName) {
console.log(`观察${partName}图纸`);
}
}
/**
* @author: 周靖松
* @information: 设计图实现
* @Date: 2019-07-14 10:11:25
*/
class CreatDiagram extends Diagram {
constructor() {
super();
}
build(partName) {
super.build(partName);
console.log(`建造开始${partName}`);
this.worker = new worker(partName);
}
getResult() {
console.log('完工');
return this.worker;
}
}
/**
* @author: 周靖松
* @information: 工人类
* @Date: 2019-07-14 10:11:40
*/
class worker {
constructor(material) {
console.log(`我建造了${material}`);
this.data = material
}
}
/**
* @author: 周靖松
* @information: 开发商
* @Date: 2019-07-14 10:11:54
*/
class Developer {
constructor() {
this.need = ['卧室', '厨房', '客厅'];
console.log("我需要这样的房间");
}
construct() {
console.log("开始建造");
let workerOk=this.need.map(el=>{
let builder = new CreatDiagram();
builder.build(el);
return builder.getResult();
})
console.log("房子不错");
console.log(workerOk);
}
}
// 要求产品
let home = new Developer();
// 生成产品
home.construct();
具体打印结果如下

建造者模式的优缺点
优点
- 在建造者模式里边, 你不需要知道建造的过程是怎么样的,创建的实例将会与过程解耦。
- 而且建造者模式里边可以根部不同的的具体实现来得到不同的实例
- 建造者模式对于扩展来说很方便,不需要改变原有的代码
缺点
- 同样的,如果类内部的差异比较大,或者变化复杂的话,你就会增加很多对应的实现类,会使得代码比较臃肿
总结
上一篇介绍的抽象工厂,相比较而言,抽象工厂返回的就好比是房子的一些类的房屋,返回的是具体的小类,比较灵活,随意组装,但是像一些复杂的组成,则有些啰嗦,而建造者则返回的是这些类组装好的一个对象,各有各的应用场景,建造者模式可以比较适用与那些有固定生成顺序的对象,或者对象内部有复杂结构的情况
js常用设计模式实现(三)建造者模式的更多相关文章
- java常用设计模式五:建造者模式
1.定义 是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 产品类:一般是一个较为复杂的对象,也就是说创建对象的 ...
- 从ES6重新认识JavaScript设计模式(三): 建造者模式
1 什么是建造者模式? 建造者模式(Builder)是将一个复杂对象的构建层与其表示层相互分离,同样的构建过程可采用不同的表示. 建造者模式的特点是分步构建一个复杂的对象,可以用不同组合或顺序建造出不 ...
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- Java开发中常用的设计模式(三)---建造者模式
一. 模式结构 建造者模式主要包含四个角色: Product:产品角色. Builder:抽象建造者.它声明为创建一个Product对象的各个部件指定的抽象接口. ConcreteBuilder:具体 ...
- php设计模式三-----建造者模式
1.简介 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子 ...
- 设计模式学习之建造者模式(Builder,创建型模式)(6)
假如我们需要建造一个房子,并且我们也不知道如何去建造房子,所以就去找别人帮我们造房子 第一步: 新建一个房子类House,里面有房子该有的属性,我们去找房子建造者接口HouseBuilder,我们要建 ...
- java设计模式-----6、建造者模式
Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类 ...
- IOS设计模式浅析之建造者模式(Builder)
定义 "将一个复杂对象的构建与它的表现分离,使得同样的构建过程可以创建不同的表现". 最初的定义出现于<设计模式>(Addison-Wesley,1994). 看这个概 ...
- js常用设计模式实现(一)单例模式
前言 什么是设计模式 设计模式是一种能够被反复使用,符合面向对象特性的代码设计经验的总结,合理的使用设计模式能够让你得代码更容易维护和可靠 设计模式的类型共分为创建型模式,结构型模式,行为型模式三种 ...
随机推荐
- 图像滤镜艺术---(Sketch Filter)素描滤镜
原文:图像滤镜艺术---(Sketch Filter)素描滤镜 (Sketch Filter)素描滤镜 素描滤镜的实现方法比较简单,这里我们直接写出算法过程如下: 1,对原图S进行去色命令得到灰度图A ...
- qt mingw64版本编译报错:incorrect register `%rax' used with `l' suffix(movl要改成mov)
环境:WIN10 编译器:mingw64的g++.exe 我的目的是把程序编译成64bit版本的,所以一开始遇到该错误是丈二和尚摸不着头脑,google了一圈也没找到准确的答案.后来从某些回答中大概发 ...
- 随机森林分类器(Random Forest)
阅读目录 1 什么是随机森林? 2 随机森林的特点 3 随机森林的相关基础知识 4 随机森林的生成 5 袋外错误率(oob error) 6 随机森林工作原理解释的一个简单例子 7 随机森林的Pyth ...
- 无法删除 NTFS 盘上的文件或文件夹(对Windows文件的各种情况有比较详细的描述)
简介 本文介绍您可能无法删除 NTFS 文件系统卷上的文件或文件夹的原因,以及如何分析造成此问题的不同原因从而解决此问题. 更多信息 注意:在内部,NTFS 将文件夹作为特殊类型的文件进行处理.因此, ...
- Qt5.5.0在Windows下静态编译(修改参数以后才能支持XP)good
测试系统环境: windows 7 编译软件环境: vs2013 + QT5.5.0 [源码地址:http://download.qt.io/official_releases/qt/5.5/5.5. ...
- Virtualbox使用点滴(共享USB设备,Linux下我的用户没有加到vboxuser中去)
由于网银客户端的问题,只能够在windows环境下支付,所以一直保存着一个激活的virtualbox下的windows,用来完成在线支付. 过去这个激活的windows是安装在ubuntu 10.10 ...
- Java Socket基础[备忘]
1.服务端----Server.java import javax.swing.*; import java.io.*; import java.net.*; import java.awt.*; i ...
- IT++数学、信号、通讯类库,Blitz++数学,Armadillo 线性代数,Dlib网络,线程,图形,数学,图像,数据挖掘/机器学习,XML等等
https://en.wikipedia.org/wiki/Blitz%2B%2B https://en.wikipedia.org/wiki/IT%2B%2B https://en.wikipedi ...
- js中prototype与__proto__区别
proto(隐式原型)与prototype(显式原型) 显式原型 explicit prototype property:每一个函数在创建之后都会拥有一个名为prototype的属性,这个属性指向函数 ...
- Markdown教程 <1>
Markdown教程 <1> 本文在本地使用atom编辑后,直接将代码赋值到博客园中的markdown编辑器中生成 1. markdown字体,段落控制 以下引用块里面为源码,引用块下方为 ...