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 学习笔记(三)
Dec 29 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
Jun 08 Javascript
JS上传图片前实现图片预览效果的方法
Mar 02 Javascript
ES6中Class类的静态方法实例小结
Oct 28 Javascript
在Vant的基础上封装下拉日期控件的代码示例
Dec 05 Javascript
微信小程序结合Storage实现搜索历史效果
May 18 Javascript
微信小程序如何调用图片接口API并居中显示
Jun 29 Javascript
js使用文件流下载csv文件的实现方法
Jul 15 Javascript
JS实现电商商品展示放大镜特效
Jan 07 Javascript
js实现页面图片消除效果
Mar 24 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
Jul 27 Javascript
js实现自动锁屏功能
Jun 02 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截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
PHP+ACCESS 文章管理程序代码
2010/06/21 PHP
php中mkdir函数用法实例分析
2014/11/15 PHP
ThinkPHP连接数据库的方式汇总
2014/12/05 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
AJAX的跨域与JSONP(为文章自动添加短址的功能)
2010/01/17 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
2016/10/13 Javascript
详解ECharts使用心得总结
2016/12/06 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
JS实现的随机排序功能算法示例
2017/06/09 Javascript
解决betterScroll在vue中存在图片时,出现拉不动的问题
2018/09/27 Javascript
vue 实现超长文本截取,悬浮框提示
2020/07/29 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
2020/09/25 Javascript
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
[36:05]完美世界DOTA2联赛循环赛 Forest vs DM 第一场 11.06
2020/11/06 DOTA
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
python3中函数参数的四种简单用法
2018/07/09 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
python使用openpyxl操作excel的方法步骤
2020/05/28 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
巴西家用小家电购物网站:Polishop
2016/08/07 全球购物
平面设计的岗位职责
2013/11/08 职场文书
2014年机关植树节活动方案
2014/02/27 职场文书
爱情寄语大全
2014/04/09 职场文书
公司合作协议范文
2014/10/01 职场文书
班主任2015新年寄语
2014/12/08 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
2015年中秋晚会主持稿
2015/07/30 职场文书
抖音短视频(douyin)去水印工具的实现代码
2021/03/30 Javascript
Laravel中获取IP的真实地理位置
2021/04/01 PHP
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python
Win11怎么跳过联网验机 ?Win11跳过联网验机激活教程
2022/04/05 数码科技
Golang jwt身份认证
2022/04/20 Golang