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 相关文章推荐
如何获取select下拉框的值(option没有及有value属性)
Nov 08 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
May 05 Javascript
javascript常用代码段搜集
Dec 04 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
Aug 13 Javascript
jQuery Easyui Datagrid实现单行的上移下移及保存移动的结果
Aug 15 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
Apr 04 Javascript
JS实现异步上传压缩图片
Apr 22 Javascript
angularjs $http实现form表单提交示例
Jun 09 Javascript
vue-cli项目无法用本机IP访问的解决方法
Sep 20 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
Jan 16 jQuery
浅谈js中的attributes和Attribute的用法与区别
Jul 16 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
PHP 简单日历实现代码
2009/10/28 PHP
discuz程序的PHP加密函数原理分析
2011/08/05 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
深入了解PHP类Class的概念
2012/06/14 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
Javascript倒计时代码
2010/08/12 Javascript
JS面向对象编程浅析
2011/08/28 Javascript
JS获取图片实际宽高及根据图片大小进行自适应
2013/08/11 Javascript
Javascript基础 函数“重载” 详细介绍
2013/10/25 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
js淡入淡出的图片轮播效果代码分享
2015/08/24 Javascript
react-native使用react-navigation进行页面跳转导航的示例
2017/09/07 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
python 按不同维度求和,最值,均值的实例
2018/06/28 Python
python3.6编写的单元测试示例
2019/08/17 Python
Python 使用多属性来进行排序
2019/09/01 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
Python正则表达式如何匹配中文
2020/05/27 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
旅游项目开发策划书
2014/01/18 职场文书
素食餐饮项目创业计划书
2014/02/02 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
离职报告范文
2014/11/04 职场文书
西柏坡导游词
2015/02/05 职场文书
党支部创先争优公开承诺书
2015/04/30 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
Mysql数据库命令大全
2021/05/26 MySQL
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS