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常用设计模式实现(一)单例模式
前言 什么是设计模式 设计模式是一种能够被反复使用,符合面向对象特性的代码设计经验的总结,合理的使用设计模式能够让你得代码更容易维护和可靠 设计模式的类型共分为创建型模式,结构型模式,行为型模式三种 ...
随机推荐
- WPF 附加属性的使用
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- C# 声明基于角色的安全性
using System;using System.Collections.Generic;using System.Linq;using System.Security;using System.S ...
- WPF ScrollViewer(滚动条) 自定义样式表制作 (改良+美化)
原文:WPF ScrollViewer(滚动条) 自定义样式表制作 (改良+美化) 注释直接写在代码里了 不太理解意思的 可以先去看看我上一篇 WPF ScrollViewer(滚动条) 自定 ...
- 数据绑定(二)把控件作为Binding源
原文:数据绑定(二)把控件作为Binding源 下面的代码把一个TextBox的Text属性关联在了Slider的Value属性上 <Window x:Class="WpfApplic ...
- Windows NT WinLogon Notify
在NT系列Windows操作系统中,恶意软件可以通过关联Winlogon特定的事件来使自身被启动,如Lock,Logoff,Logon,Shutdown,StartScreenSaver,StartS ...
- 用C#修改系统区域和语言设置
原文:用C#修改系统区域和语言设置 这几天做项目,因为客户机的系统不同,发现客户机的区域和语言设置也不尽相同,导致程序运行时根据时间判断的很多属性和方法都出现各种各样的千奇百怪的问题. 修改程序太费时 ...
- 给文件右击菜单增加7-ZIP浏览功能(用注册表设置Shell调用预览命令)
疯狂delphi delphiXE7.XE8.XE10公开课A 群号:58592705 QQ:513187410 朱建强 BAT-给文件右击菜单增加7-ZIP浏览功能 Reg给文件右击菜单增加7-ZI ...
- INS-13001—win10系统安装oracle11g时遇到INS-13001环境不满足最低要求
升级win10系统之后,需要重新安装Oracle,因为在安装Oralce11g时,使用64位的会出现各种不兼容问题,我每次安装都是使用32位的数据库. 在安装时点击setup.exe之后,出现了:[I ...
- 从IntToHex()说起,栈/堆地址标准写法 good
学习中的一些牢骚.栈/堆地址标准写法. 2017-02-12 • 杂谈 • 暂无评论 • 老衲 •浏览 226 次 我一直都在寻找各种业务功能的最简单写法,用减法的模式来开发软件.下面是我的写法,如果 ...
- 【Qt】一劳永逸解决UAC问题(修改mkspecs\win32-msvc2012\qmake.conf)
如果你的程序跑在一个开启了UAC保护的系统中,而你的程序又没有"盾牌"的话,程序总是会受到各种阻挠的,比如读写文件,写注册表等. 有了"盾牌"的话就不会出现一些 ...