顺便讲一下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;
},
}
})();