您的位置:首页 > 编程语言 > Java开发

Java单例模式

2016-01-19 16:58 573 查看

1 、介绍:

单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此有些设计大师并把把其称为设计模式之一。

2 、应用场景:

1. Windows的Task Manager(任务管理器)就是很典型的单例模式(这个很熟悉吧),想想看,是不是呢,你能打开两个windows task manager吗? 不信你自己试试看哦~ 

2. windows的Recycle Bin(回收站)也是典型的单例应用。在整个系统运行过程中,回收站一直维护着仅有的一个实例。

3. 网站的计数器,一般也是采用单例模式实现,否则难以同步。

4. 应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

5. Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源。

6. 数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为何用单例模式来维护,就可以大大降低这种损耗。

7. 多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。

8. 操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。

9. HttpApplication 也是单位例的典型应用。熟悉ASP.Net(IIS)的整个请求生命周期的人应该知道HttpApplication也是单例模式,所有的HttpModule都共享一个HttpApplication实例.

3、七种实现方法:

1、

[html] view
plain copy

 print?

package Singleton;  

  

public class SingletonOne {  

      private  SingletonOne(){}  

      private static class LazyHolder{  

          private static final SingletonOne INSATNCE=new SingletonOne();  

      }  

      public static SingletonOne getInstance(){  

          return LazyHolder.INSATNCE;  

      }  

}  

2、

[html] view
plain copy

 print?

package Singleton;  

  

public class SingletonTwo {  

     private SingletonTwo(){};  

     private static final SingletonTwo INSTANCE=new SingletonTwo();  

     public static SingletonTwo getInstance(){  

         return INSTANCE;  

     }  

}  

3、

[html] view
plain copy

 print?

package Singleton;  

  

public class SingletonThree {  

    private static final SingletonThree instance ;  

    static{  

        try{  

            instance=new SingletonThree();  

        }catch(Exception e){  

            throw new RuntimeException("an error occurred!");  

        }  

    }  

    public static SingletonThree getInsance(){  

        return instance;  

    }  

    private SingletonThree(){}  

}  

4、

[html] view
plain copy

 print?

package Singleton;  

  

public enum SingletonFour {  

    INSTANCE;  

    public void execute(String arg){  

          

    }  

}  

5、

[html] view
plain copy

 print?

package Singleton;  

  

public class SingletonFive {  

      private static volatile SingletonFive instance;  

      private SingletonFive(){}  

      public static SingletonFive getInstance(){  

          if(instance==null){  

              synchronized (SingletonFive.class) {  

                if(instance==null){  

                    instance=new SingletonFive();  

                }  

            }  

          }  

          return instance;  

      }  

}  

6、

[html] view
plain copy

 print?

使用apache commons lang: LazyInitializer  

  

 public class SingletonSix extends LazyInitializer<ComplexObject> {  

     @Override  

     protected ComplexObject initialize() {  

         return new ComplexObject();  

     }  

 }  

  

 // Create an instance of the lazy initializer  

 SingletonSix initializer = new SingletonSix();  

 ...  

 // When the object is actually needed:  

 ComplexObject cobj = initializer.get();  

7、

[html] view
plain copy

 print?

使用guava:  

  

 private static final Supplier<String> tokenSup = Suppliers.memoize(new Supplier<String>() {  

        @Override  

        public String get() {  

            //do some init  

            String result = xxx;  

            return result;  

        }  

    });  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: