(二)js前端开发中设计模式之单例模式
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
(图片来源网络,侵删)
利弊分析
-
优点:
- 单例模式可以保证内存中只有一个对象,减少了内存的开销。
- 可以避免对资源的多重占用。
- 方便测试,可以通过接口来控制类的实例化。
- 避免对资源的多重占用。
-
缺点:
- 单例模式一般没有接口,扩展比较困难。
- 单点访问,可能会导致模块的耦合。
-
基本的单例模式,就是对象字面量
const SingleTon = { name:"tom", age"26", say(){ console.log("hello") }, eat(){ console.log("rice") } } //访问单例 SingleTon.gender = '男' SingleTon.say()划分命名空间
var GianCrop = {}; GianCrop.common = {}; GianCrop.errorCodes = {}; GianCrop.pageHandler = {};使用私有成员
- 方式一:约定
GianCrop.dataParse = { //约定私有成员以_开头 _method1() {}, _method2() {}, _method3() {} //约定公共成员不以_开头 method1() {}, method2() {}, method3() {} };- 方式二:闭包
// MyNameSpce.SingleTon = {} // 闭包单例模式 let MyNameSpce = {}; MyNameSpce.SingleTon = (function () { return { name: "tom", age: 26, say() { console.log("hello"); }, eat() { console.log("rice"); }, }; })(); const name = MyNameSpce.SingleTon.name; console.log("🚀 ~ name:", name);增加私有成员
let MyNameSpce = {}; MyNameSpce.SingleTon = (function () { let isFlag = true; let count = 30; function getCount() { return count; } return { name: "tom", age: 26, say() { console.log("hello"); }, eat() { console.log("rice"); }, getFlag() { return isFlag; }, getCount, }; })(); const { name, getFlag, getCount } = MyNameSpce.SingleTon; console.log("🚀 ~ name:", name); console.log("🚀 ~ getFlag:", getFlag()); console.log("🚀 ~ getCount:", getCount()); /** * 🚀 ~ name: tom demo05.js:46 🚀 ~ getFlag: true demo05.js:47 🚀 ~ getCount: 30 */惰性单例模式
let MyNameSpce1 = {}; MyNameSpce1.SingleTon = (function () { let singleTon = null; function init() { let isFlag = true; let count = 30; function getCount() { return count; } console.log("init-----------"); return { name: "tom", age: 26, say() { console.log("hello"); }, eat() { console.log("rice"); }, getFlag() { return isFlag; }, getCount, }; } return { getInstance() { if (!singleTon) { singleTon = init(); } return singleTon; }, }; })(); const demo = MyNameSpce1.SingleTon.getInstance(); const demo2 = MyNameSpce1.SingleTon.getInstance(); console.log(demo.name); console.log(demo2.name); //调用了两次实例,但是只初始化了一次 /** * * 🚀 ~ name: tom * 🚀 ~ getFlag: true 🚀 ~ getCount: 30 init----------- tom tom */分支
var SimpleXhrFactory = (function () { const standard = { createXhrObjec() { return new XMLHttpRequest(); }, }; const activeXNew = { createXhrObject() { return new ActiveXObject("Microsoft.XMLHTTP"); }, }; const activeOld = { createXhrObject() { return new ActiveXObject("Msxml2.XMLHTTP"); }, }; var testObject; try { testObject = standard.createXhrObject(); return standard; } catch (error) { try { testObject = activeXNew.createXhrObject(); return activeXNew; } catch (error) { try { testObject = activeOld.createXhrObject(); return activeOld; } catch (error) { throw new Error("can't create xhr object"); } } } })();
- 方式二:闭包
- 方式一:约定
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
