<body>
<h3>设计模式知识连载(18)---单例模式:</h3>
<p>
单例模式:又被称为单体模式,是只允许实例化一次的对象类。
常用一个对象来规划一个命名空间,井井有条的管理对象上的属性和方法
</p>
<script type="text/javascript">
/**
* 案例,方式一:初始
*/
// // 滑动特效
// function g(id) {
// return document.getElementById(id) ;
// } ;
// function css(id, key, value) {
// g(id).style[key] = value ;
// } ;
// function attr(id, key, value) {
// g(id)[key] = value ;
// } ;
// function html(id, value) {
// g(id).innerHTML = value ;
// } ;
// function on(id, type, fn) {
// g(id)['on' + type] = fn ;
// } ;
/**
* 案例,方式二:单例模式
*/
// 滑动特效
var GP = {
g : function(id) {
return document.getElementById(id) ;
},
css : function(id, key, value) {
// 简单样式的属性设置
// g(id).style[key] = value ; // 用了单例模式,这样写会报错
// GP.g(id).style[key] = value ; // 得加上命名空间
this.g(id).style[key] = value ; // 这里在同一个命名空间里,所以可以用this
},
attr : function(id, key, value) {
this.g(id)[key] = value ;
},
html : function(id, value) {
this.g(id).innerHTML = value ;
},
on : function(id, type, fn) {
this.g(id)['on' + type] = fn ;
}
} ;
/****
* 用单例模式创建一个小型代码库
****/
var Single = {
// 公用模块
Util : {
util_method1 : function() {},
util_method2 : function() {}
// ...
},
// 工具模块
Tool : {
tool_method1 : function() {},
tool_method2 : function() {}
// ...
},
// ajax模块
Ajax : {
get : function() {},
post : function() {}
// ...
},
// 其他模块
Other : {
}
} ;
// 使用模块
Single.Util.util_method2() ;
Single.Tool.tool_method1() ;
Single.Ajax.get() ;
/****
* 管理静态变量
****/
var Conf =(function() {
// 私有变量
var conf = {
MIN_NUM : 1,
MAX_NUM :100,
COUNT : 300
} ;
// 返回取值器对象
return {
// 取值器方法
get : function(name) {
return conf[name] ? conf[name] : null ;
}
}
})() ;
// 测试用例:
var count = Conf.get('COUNT') ;
console.log('count:', count) ; // 300
/****
* 惰性单例(惰性创建)
* 有些时候对于单例对象需要延迟创建
****/
// 惰性载入单例
var LazySingle = (function() {
// 单例实例引用
var _instance = null ;
// 单例
function Single() {
// 这里定义私有属性和方法
return {
publicProperty : '1.0',
publicMethod : function() {}
}
} ;
// 获取单例对象接口
return function() {
// 如果为创建单例将创建单例
if(!_instance) {
_instance = Single() ;
} ;
// 返回单例
return _instance ;
}
})() ;
// 测试用例:
var publicProperty = LazySingle().publicProperty ;
console.log('publicProperty:', publicProperty) ;
</script>
</body>