javascript设计模式之单例模式

本文深入解析Java中的单例模式实现方式,包括饿汉式、懒汉式、多线程访问和双重锁定,并通过JavaScript闭包实现成员变量的私有化。同时,介绍了单例模式的延迟初始化技巧,以及如何在JavaScript中实现真正的封装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顺便讲一下JAVA里边的几种单例模式直接上例子

1.

package com.模式.创建型模式;

/**
 * 饿汉式
 * @author Administrator
 *
 */
public class 单例模式_饿汉式 {

	private static 单例模式_饿汉式 singleton = new 单例模式_饿汉式();//私有静态的本类实例对象
	private 单例模式_饿汉式(){}//私有构造方法,防止其他地方创建对象
	
	public static 单例模式_饿汉式 get单例模式(){
		return singleton;//返回单例模式对象
	}
	
}

 2.

package com.模式.创建型模式;

public class 单例模式_懒汉式 {
	private static 单例模式_懒汉式 singleton ;//私有静态的本类实例对象
	private 单例模式_懒汉式(){}//私有构造方法,防止其他地方创建对象
	
	public static 单例模式_懒汉式 get单例模式_懒汉式(){
		if(singleton == null)singleton = new 单例模式_懒汉式();
		return singleton;
	}
}

 3.

package com.模式.创建型模式;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class 单例模式_多线程访问 {

	private static 单例模式_多线程访问 singleton;

	private 单例模式_多线程访问() {}

	private static Lock lock = new ReentrantLock();// 锁住对象

	
	public static 单例模式_多线程访问 get单例模式_多线程访问() {
		
		lock.lock();
		try {
			if (singleton == null) singleton = new 单例模式_多线程访问();
		} finally  {
			lock.unlock();
		}
		return singleton;
	}

}

 4.

package com.模式.创建型模式;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class 单例模式_双重锁定 {
	private static 单例模式_双重锁定 singleton;
	private 单例模式_双重锁定(){}
	private static Lock lock = new ReentrantLock();//锁住对象
	//避免每次调用都new
	public static 单例模式_双重锁定  get单例模式_双重锁定(){
		
		if (singleton == null) {
			lock.lock();
			try {
				if (singleton == null)
					singleton = new 单例模式_双重锁定();
			} finally {
				lock.unlock();
			}
		}
		return singleton;
		

	}
}

 要讲单例模式就得讲javascript的闭包,因为只有闭包才能是成员变量真正私有化。

 闭包讲解:http://javasam.iteye.com/admin/blogs/1905306

 

 

示例:

SinglentonNamespace.Singleton=(function(){

       var privateAttr = false;//私有属性

       var privateAttr = [0,1,2];

       //私有方法

       function method1(){

            //doSomething;

        }

 

 

        return {

               publicAttr1:true,//没有var关键字

               publicAttr2:10,//注意是逗号

 

               public method1(){

                       var result = method1();

                       return result;

               }

        }

})();

我们可以看到因为我们使用了闭包,在闭包内部我们根本不用this或者直接对象名+.的访问方式。实现了真正的封装。

接下来我们讲讲延迟初始化

java单例模式中都有一个getInstance()这样的类似方法 ,而上面的例子中根本没有这个方法,为了更加像单例模式,接下来我们就加上getInstance()这个方法。为了延迟加载我们必须在刚才的代码基础上再加上一层方法

SinglentonNamespace.Singleton=(function(){

  var singleton; //私有本类实例。

  

  //私有方法,外部不能访问

  function constructor(){

       var privateAttr = false;//私有属性

       var privateAttr = [0,1,2];

       //私有方法

       function method1(){

            //doSomething;

        }

 

 

        return {

               publicAttr1:true,//没有var关键字

               publicAttr2:10,//注意是逗号

 

               public method1(){

                       var result = method1();

                       return result;

               }

        }

     }

   

 

    //重点来了

   return{

       getInstance:function (){

 

            if(!singleton) singleton = constructor();//创建实例+延迟加载

       

            return singleton;

       },

 

   }

})();

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值