二十三种设计模式之单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式常见的写法有两种一种是懒汉式,一种是饿汉式。先介绍一下饿汉式。
public class Mge01 {
/**
* 实例化类的对象
*/
private final static Mge01 INSTANCE = new Mge01();
/**
* 把该类的构造方法私有化
*/
private Mge01(){
}
/**
* 获取对象的方法
* @return INSTANCE
*/
public static Mge01 getINSTANCE(){
return INSTANCE;
}
}
根据代码可以看出饿汉式,缺点是INSTANCE在类加载的时候就实例化了,可能会浪费内存,优点则是执行效率高,线程安全。下面介绍懒汉式。
public class Mge02 {
private static Mge02 INSTANCE;
private Mge02(){
}
public static synchronized Mge02 getInstance(){
if (INSTANCE==null){
INSTANCE = new Mge02();
}
return INSTANCE;
}
public static void main(String[] args) {
Mge02 m1 = getInstance();
Mge02 m2 = getInstance();
System.out.println(m1==m2);
}
}
懒汉式解决了类加载时就实例化对象的问题,但是也面临另一个问题,把getInstance()加了锁降低了效率。还有另一种即比懒汉式效率高又可以避免类加载时就实例化对象的方法。具体看下面代码:
public class Mge03 {
private static volatile Mge03 INSTANCE;
private Mge03(){
}
public static Mge03 getINSTANCE(){
if (INSTANCE == null){
synchronized (Mge03.class){
if (INSTANCE==null){
INSTANCE = new Mge03();
}
}
}
return INSTANCE;
}
}
这种写法是通过减少同步代码块的方式,既提升了一定的效率,也避免了饿汉式的问题。但是在实际生产环境中还是根据需求来进行设计,不一定非得写第三种。