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 相关文章推荐
img的onload的另类用法
Jan 10 Javascript
jquery 防止表单重复提交代码
Jan 21 Javascript
js实现的真正的iframe高度自适应(兼容IE,FF,Opera)
Mar 07 Javascript
GridView中获取被点击行中的DropDownList和TextBox中的值
Jul 18 Javascript
从JQuery源码分析JavaScript函数的apply方法与call方法
Sep 25 Javascript
js代码验证手机号码和电话号码是否合法
Jul 30 Javascript
jQuery mobile转换url地址及获取url中目录部分的方法
Dec 04 Javascript
jQuery 获取select选中值及清除选中状态
Dec 13 Javascript
详解angularjs结合pagination插件实现分页功能
Feb 10 Javascript
vue中的router-view组件的使用教程
Oct 23 Javascript
关于vue里页面的缓存详解
Nov 04 Javascript
JS实现随机点名器
Apr 12 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
Win2003服务器安全加固设置--进一步提高服务器安全性
2007/05/23 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
JS在onclientclick里如何控制onclick的执行
2016/05/30 Javascript
深入理解JS中的Function.prototype.bind()方法
2016/10/11 Javascript
Javascript 函数的四种调用模式
2016/11/05 Javascript
JQ中$(window).load和$(document).ready区别与执行顺序
2017/03/01 Javascript
Bootstrap框架建立树形菜单(Tree)的实例代码
2017/10/30 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
使用npm安装最新版本nodejs
2018/01/18 NodeJs
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
微信小程序new Date()方法失效问题解决方法
2019/07/29 Javascript
JavaScript使用表单元素验证表单的示例代码
2019/08/20 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
python Django框架实现自定义表单提交
2016/03/25 Python
Python匹配中文的正则表达式
2016/05/11 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
Python实现桶排序与快速排序算法结合应用示例
2017/11/22 Python
Python2和Python3中urllib库中urlencode的使用注意事项
2018/11/26 Python
python面试题之列表声明实例分析
2019/07/08 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
python应用Axes3D绘图(批量梯度下降算法)
2020/03/25 Python
查看已安装tensorflow版本的方法示例
2020/04/19 Python
美国儿童服装、家具和玩具精品店:Maisonette
2019/11/24 全球购物
彩色的非洲教学反思
2014/02/18 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
实习协议书
2015/01/27 职场文书
人民的好儿女观后感
2015/06/18 职场文书