原创

JAVA 设计模式中单例模式讲解

一、单例模式概念及特点

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。

单例模式有一下特点:

1、单例类只能有一个实例。

2、单例类必须自己自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。


单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。


正是由于这个特 点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或 文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可。这种方式极大地简化了在复杂环境 下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步问题。


二、代码实现

1、饿汉式单例,代码如下:

/**
 * 饿汉式单例类.初始化时,自动实例化 
 * 静态方法只在编译期间执行一次初始化,即只会创建一个对象
 * @author www.yoodb.com
 *
 */
public class Singleton {
   //私有的默认构造子
   private Singleton() {}
   //已经自行实例化 
   private static final Singleton single = new Singleton();
   //静态工厂方法 
   public static Singleton getInstance() {
       return single;
   }
}


2、懒汉式单例,代码如下:

/**
 * 懒汉式单例类.在第一次调用的时实例化
 * if判断确保对象只创建一次   
 * @author www.yoodb.com
 *
 */
public class Singleton {  
  //私有的默认构造子  
  private Singleton() {}  
  //注意,这里没有final      
  private static Singleton single=null;  
  //静态工厂方法   
  public synchronized  static Singleton getInstance() {  
       if (single == null) {    
           single = new Singleton();  
       }    
      return single;  
  }  
}


3、登记式单例,代码如下:

/**
 * 登记式单例类.静态块中自动处理,下次使用时直接获取  
 * @author www.yoodb.com
 */
public class Singleton {  
    private static Map<String,Singleton> map = new HashMap<String,Singleton>();  
    static{  
        Singleton single = new Singleton();  
        map.put(single.getClass().getName(), single);  
    }  
    //保护的默认构造子  
    private Singleton(){}  
    //静态工厂方法,返还此类惟一的实例  
    public static Singleton getInstance(String name) {  
        if(name == null) {  
            name = Singleton.class.getName();  
        }  
        if(map.get(name) == null) {  
            try {  
                map.put(name, (Singleton) Class.forName(name).newInstance());  
            } catch (InstantiationException e) {  
                e.printStackTrace();  
            } catch (IllegalAccessException e) {  
                e.printStackTrace();  
            } catch (ClassNotFoundException e) {  
                e.printStackTrace();  
            }  
        }  
        return map.get(name);  
    }  
}


关注下方微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

相关推荐

评论

分享:

支付宝

微信