最近项目不太忙,难得有时间看看书,平时挺喜欢 js 这门语言。也看过很多高级教程,觉得自己还是比较热衷于 js 的设计模式。这一次重温一下《JavaScript 设计模式与开发实践》,开篇为单例模式。
- /**
- * pre 单例模式
- * 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点
- * 应用:单例模式是一种常用的模式,有一些对象我们往往只需要一个,
- * 比如线程池、全局缓存、浏览器中的 window 对象等。
- */
- //--------------singleton-01-------------
- /*写法1*/
- var Singleton = function(name){
- this.name = name;
- this.instance = null;
- };
- Singleton.prototype.getName = function(){
- alert(this.name);
- };
- Singleton.getInstance = function(){
- if(!this.instance){
- this.instance = new Singleton(name);
- }
- return this.instance;
- };
- var a = Singleton.getInstance("amy");
- var b = Singleton.getInstance("ben");
- alert(a === b);
- // ------------singleton-02----------------
- /*写法2*/
- var Singleton = function(name){
- this.name = name;
- }
- Singleton.prototype.getName = function(){
- return this.name;
- }
- Singleton.getInstance = (function(){
- var instance = null;
- return function(name){
- if(!instance){
- instance = new Singleton(name);
- }
- return instance;
- }
- })();
- var a = Singleton.getInstance("amy");
- var b = Singleton.getInstance("ben");
- alert(a === b);
- // ------------singleton03-----------
- /*写法3*/
- var Singleton = (function(){
- var instance;
- return function(name){
- if(instance){
- return instance;
- }
- this.name = name;
- instance = this;
- }
- })();
- var a = new Singleton("amy");
- var b = new Singleton("ben");
- alert(a === b);
- //---------------- 示例 ---------------
- var getSingleton = function(fn) {
- var result;
- return function() {
- if(!result) {
- result = fn.apply(this, arguments);
- }
- return result;
- }
- };
- var getSingletonVip = (function() {
- var instance;
- return function(fn) {
- return instance || (instance = fn.apply(this, arguments));
- }
- })();
- var createLoginUser = function() {
- var div = document.createElement("div");
- div.innerhtml = '这是登录框';
- document.body.appendChild(div);
- return div;
- };
- var createInfoGrid = function() {
- var div = document.createElement("div");
- div.innerHTML = '这是列表信息框';
- document.body.appendChild(div);
- return div;
- };
- //--执行singleton1
- var createUserDiv = getSingleton(createLoginUser);
- createUserDiv();
- createUserDiv();
- //--执行singleton2
- getSingletonVip(createLoginUser);
- getSingletonVip(createLoginUser);
来源: http://www.jb51.net/article/115801.htm