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 相关文章推荐
学习ExtJS 访问容器对象
Oct 07 Javascript
Lazy Load 延迟加载图片的 jQuery 插件
Feb 06 Javascript
jquery写个checkbox——类似邮箱全选功能
Mar 19 Javascript
javascript实现可改变滚动方向的无缝滚动实例
Jun 17 Javascript
使用js实现雪花飘落效果
Aug 26 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
将List对象列表转换成JSON格式的类实现方法
Jul 04 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
Jan 16 Javascript
微信小程序实现全局搜索代码高亮的示例
Mar 30 Javascript
默认浏览器设置及vue自动打开页面的方法
Sep 21 Javascript
Vue实现一个图片懒加载插件
Mar 11 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
Apr 29 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生成EAN_13标准条形码实例
2013/11/13 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
最近项目写了一些js,水平有待提高
2009/01/31 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
Jquery实战_读书笔记1—选择jQuery
2010/01/22 Javascript
javascript中有趣的反柯里化深入分析
2012/12/05 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
2013/08/26 Javascript
js实现特定位取反原理及示例
2014/06/30 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
Javascript动画效果(4)
2016/10/11 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
2017/12/04 Javascript
浅谈vue项目可以从哪些方面进行优化
2018/05/05 Javascript
nodejs图片处理工具gm用法小结
2018/12/12 NodeJs
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
[47:31]完美世界DOTA2联赛PWL S3 INK ICE vs DLG 第一场 12.12
2020/12/16 DOTA
Python实现设置windows桌面壁纸代码分享
2015/03/28 Python
Python判断直线和矩形是否相交的方法
2015/07/14 Python
Python爬虫实现简单的爬取有道翻译功能示例
2018/07/13 Python
python3实现猜数字游戏
2020/12/07 Python
python3中eval函数用法使用简介
2019/08/02 Python
Python Selenium截图功能实现代码
2020/04/26 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
Footshop乌克兰:运动鞋的最大选择
2019/12/01 全球购物
文明班级建设方案
2014/05/15 职场文书
商务经理岗位职责
2014/08/03 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
党支部先进事迹材料
2014/12/24 职场文书
2015年妇产科工作总结
2015/05/18 职场文书
2019年思想汇报
2019/06/20 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS