原创

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),专注Java技术干货分享!让你从此路人变大神!回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。微信搜索小程序“Java精选面试题”,内涵3000+道Java面试题!

涵盖:互联网那些事、算法与数据结构、SpringMVC、Spring boot、Spring Cloud、ElasticSearch、Linux、Mysql、Oracle等

评论

分享:

支付宝

微信