首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

javascript设计方式之单例模式

2013-07-16 
javascript设计模式之单例模式顺便讲一下JAVA里边的几种单例模式直接上例子1.package com.模式.创建型模式

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;

?????? },

?

?? }

})();

?

?

热点排行