js设计模式学习 --- 单例模式1
什么单例模式
单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池、全局缓存、浏览器中的window 对象等。在JavaScript 开发中,单例模式的用途同样非常广泛。试想一下,当我们单击登录按钮的时候,页面中会出现一个登录浮窗,而这个登录浮窗是唯一的,无论单击多少次登录按钮,这个浮窗都只会被创建一次,那么这个登录浮窗就适合用单例模式来创建。
实现单例模式
<script type="text/javascript">var CreateDiv = function(html){this.html = html;this.init();};CreateDiv.prototype.init = function(){var div = document.createElement('div');div.innerHTML = this.html;document.body.appendChild(div);};/*为了满足单一职责,这里引入代理*/var ProxySingletonCreateDiv = (function(){var instance;return function(html){if(!instance){instance = new CreateDiv(html);}return instance;}})();var a = new ProxySingletonCreateDiv('11');var b = new ProxySingletonCreateDiv('22');alert(a===b);</script>
为了实现单一职责,引入代理实现了单例,CreateDiv作为一个普通的类,ProxySingletonCreateDiv负责完成单例
JavaScript中的单例模式
在java中,想要实现单例模式,需要先定义一个类,然后创建实例, 在以类为中心的语言中,这是很自然的做法,然而,JavaScript中并无类的概念,生搬硬套并无意义。单例模式的核心是确保只有一个实例,并提供全局访问,既然是要创建一个唯一的对象,为什么一定要创建一个“类”呢?
在js中创建唯一的对象很简单
var obj = {};
如果这句话放在全局作用域下,就满足了单例模式的两个条件。全局变量不是单例模式,但在开发中,我们经常会把全局变量当成单例使用。
但是全局变量很容易造成命名空间污染,在大型项目中,自己创建的对象很容被别人覆盖掉,所以开发中尽量少用全局变量,或者使用命名空间、闭包降低污染。
1.命名空间
<script type="text/javascript">/*采用字面量创建*/var std = {foo: function(){alert (1);},bar:{str:'hello world',say:function(){alert(this.str);}}};/*动态创建*/var com = {};com.namespace = function(name){var current = com,parts = name.split('.');for(var i in parts){if(!current[parts[i]]){current[parts[i]] = {};}current = current[parts[i]];}};com.namespace('demo');com.namespace('dom.style.display');console.log(com);/*相当于*/var com = {demo: {},dom: {style: {display:{}}}};</script>
2.采用闭包封装私有变量
<script type="text/javascript">var user = (function(){var __name = 'sven',__age = 29;return {getUserInfo: function(){return __name + '-' + __age;}}})();</script>
我们用下划线约定私有变量,他们被封装在闭包作用于中,外部无法访问,从而避免了全局命名空间污染
惰性单例

浙公网安备 33010602011771号