javascript设计模式 ? 建造者模式原理与应用实例分析


Posted in Javascript onApril 10, 2020

本文实例讲述了javascript设计模式 ? 建造者模式原理与应用。分享给大家供大家参考,具体如下:

介绍:建造者模式又称为生成器模式,它是一种较为复杂、使用频率相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品

定义:将一个复杂对象的构建与他的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一种对象创建型模式。

示例:

var Dialog = function (){
  this.type = '';
  this.name = '';
  this.element = '';
  this.show = function(){
    console.log(this.name + ': ' + this.type + this.element);
  }
}
 
var noticeBuilder = function(){
  this.dialog = new Dialog();
  this.setType = function(){
    this.dialog.type = 'notice';
  }
  this.setName = function(){
    this.dialog.name = '公告';
  }
  this.setElement = function(){
    this.dialog.element = '<div>notice</div>';
  }
  this.getDialog = function(){
    return this.dialog;
  }
}
 
var toastBuilder = function(){
  this.dialog = new Dialog();
  this.setType = function(){
    this.dialog.type = 'toast';
  }
  this.setName = function(){
    this.dialog.name = '提示';
  }
  this.setElement = function(){
    this.dialog.element = '<div>toast</div>';
  }
  this.getDialog = function(){
    return this.dialog;
  }
}
 
function construct(ab){
  ab.setType();
  ab.setName();
  ab.setElement();
  return ab.getDialog();
}
 
var notice = new noticeBuilder();
var toast = new toastBuilder();
var noticeIns = construct(notice);
var toastIns = construct(toast);
 
noticeIns.show(); //公告: notice<div>notice</div>
toastIns.show(); //提示: toast<div>toast</div>

在建造者模式中,客户端需要通过指挥类(construct方法)一步一步建造一个完整的产品,相同的构造过程可以创建完全不同的产品。

建造者模式可以将复杂对象的构建与其表示相分离,使用相同构建过程可以创建不同的表示层,用户只需要指定需要建造的类型就可以,而具体的建造过程和细节就不需要知道了。

为了简化系统结构,去掉construct参数,可以将construct合并到builder:

var Dialog = function (){
  this.type = '';
  this.name = '';
  this.element = '';
  this.show = function(){
    console.log(this.name + ': ' + this.type + this.element);
  }
}
var Construct = function(){
  this.construct = function(){
    this.setType();
    this.setName();
    this.setElement();
    return this.getDialog();
  }
}
 
var noticeBuilder = function(){
  this.dialog = new Dialog();
  this.setType = function(){
    this.dialog.type = 'notice';
  }
  this.setName = function(){
    this.dialog.name = '公告';
  }
  this.setElement = function(){
    this.dialog.element = '<div>notice</div>';
  }
  this.getDialog = function(){
    return this.dialog;
  }
}
 
var toastBuilder = function(){
  this.dialog = new Dialog();
  this.setType = function(){
    this.dialog.type = 'toast';
  }
  this.setName = function(){
    this.dialog.name = '提示';
  }
  this.setElement = function(){
    this.dialog.element = '<div>toast</div>';
  }
  this.getDialog = function(){
    return this.dialog;
  }
}
noticeBuilder.prototype = new Construct();
toastBuilder.prototype = new Construct();
 
var notice = new noticeBuilder();
var toast = new toastBuilder();
var noticeIns = notice.construct();
var toastIns = toast.construct();
 
noticeIns.show(); //公告: notice<div>notice</div>
toastIns.show(); //提示: toast<div>toast</div>

建造者模式总结:

优点:
* 建造者模式中,客户端不需要知道产品内部组成的细节,将产品使用与其创建解耦,使得相同创建过程可以创建不同的产品对象
* 每个具体的建造类都相对独立,方便替换和新增,满足开关原则

缺点:
* 建造者模式需要多个产品存在相同的创建流程,如果产品差异性大,就不适用建造者模式。
* 如果产品内部结构复杂多变,就需要定义很多建造类来实现这种变化,会导致系统变得庞大

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
简单的JS多重继承示例
Mar 13 Javascript
获取中文字符串的实际长度代码
Jun 05 Javascript
JavaScript插件化开发教程 (三)
Jan 27 Javascript
js 定义对象数组(结合)多维数组方法
Jul 27 Javascript
JavaScript队列、优先队列与循环队列
Nov 14 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
Dec 26 Javascript
Vue引入sass并配置全局变量的方法
Jun 27 Javascript
vue中各种通信传值方式总结
Feb 14 Javascript
vue quill editor 使用富文本添加上传音频功能
Jan 14 Javascript
vue-cli3使用mock数据的方法分析
Mar 16 Javascript
Node.js中的异步生成器与异步迭代详解
Jan 31 Javascript
javascript实现贪吃蛇经典游戏
Apr 10 #Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
Apr 10 #Javascript
Quasar Input:type=&quot;number&quot; 去掉上下小箭头 实现加减按钮样式功能
Apr 09 #Javascript
vue中的过滤器及其时间格式化问题
Apr 09 #Javascript
微信小程序保存图片到相册权限设置
Apr 09 #Javascript
微信小程序仿通讯录功能
Apr 09 #Javascript
vue cli4下环境变量和模式示例详解
Apr 09 #Javascript
You might like
用Socket发送电子邮件
2006/10/09 PHP
php GD绘制24小时柱状图
2008/06/28 PHP
php+js实现的拖动滑块验证码验证表单操作示例【附源码下载】
2020/05/27 PHP
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
Javascript+CSS实现影像卷帘效果思路及代码
2014/10/20 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
Underscore源码分析
2015/12/30 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
Javascript中数组去重与拍平的方法示例
2017/02/03 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
vue+axios实现post文件下载
2019/09/25 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python中的字符串类型基本知识学习教程
2016/02/04 Python
Python基于plotly模块实现的画图操作示例
2019/01/23 Python
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
端口镜像是怎么实现的
2014/03/25 面试题
邻里守望志愿服务活动方案
2014/08/15 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
党校党性分析材料
2014/12/19 职场文书
公司表扬稿范文
2015/05/05 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
小学教师教学反思
2016/02/24 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
nginx location优先级的深入讲解
2021/03/31 Servers