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 相关文章推荐
用 JSON 处理缓存
Apr 27 Javascript
几个比较实用的JavaScript 测试及效验工具
Apr 18 Javascript
用jquery设置按钮的disabled属性的实现代码
Nov 28 Javascript
window.addEventListener来解决让一个js事件执行多个函数
Dec 26 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
Apr 02 Javascript
js实现幻灯片效果(基于jquery插件)
Nov 05 Javascript
javascript html5实现表单验证
Mar 01 Javascript
cnpm加速Angular项目创建的方法
Sep 07 Javascript
vue仿element实现分页器效果
Sep 13 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
Sep 25 Javascript
VUE接入腾讯验证码功能(滑块验证)备忘
May 07 Javascript
Nuxt.js实战和配置详解
Aug 05 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
第十四节 命名空间 [14]
2006/10/09 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
php通过array_unshift函数添加多个变量到数组前端的方法
2015/03/18 PHP
php创建无限级树型菜单
2015/11/05 PHP
PHP面向对象程序设计OOP继承用法入门示例
2016/12/27 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
模仿jQuery each函数的链式调用
2009/07/22 Javascript
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
2009/09/15 Javascript
写给想学习Javascript的朋友一点学习经验小结
2010/11/23 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
模拟javascript中的sort排序(简单实例)
2016/08/17 Javascript
详解vue2.0 transition 多个元素嵌套使用过渡
2017/06/19 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
python使用pil生成图片验证码的方法
2015/05/08 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
python中的变量如何开辟内存
2018/06/26 Python
利用Pyhton中的requests包进行网页访问测试的方法
2018/12/26 Python
python redis 删除key脚本的实例
2019/02/19 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
Python list运算操作代码实例解析
2020/01/20 Python
给老师的检讨书
2014/02/11 职场文书
企业办公室主任岗位职责
2014/02/19 职场文书
班级课外活动总结
2014/07/09 职场文书
房屋转让协议书
2014/10/18 职场文书
文明单位汇报材料
2014/12/24 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
自书遗嘱范文
2015/08/07 职场文书
go goroutine 怎样进行错误处理
2021/07/16 Golang
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫
Python可视化神器pyecharts之绘制地理图表练习
2022/07/07 Python