javascript设计模式之单例模式
顺便讲一下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();//锁住对象//避免每次调用都newpublic 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;
?????? },
?
?? }
})();
?
?