JAVA的设计模式之单例设计模式

1、确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例。

1)理论

Java Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)。

使用单例模式最核心的一点是体现了面向对象封装特性中的“单一职责”和“对象自治”原则。很多时候我们要保证类的实例只有一个。我们可能在自己的代码中判断需要的类的实例有无,无就new一个。这样看似不错。

问题是,你用到这个类的地方有n个,这样你就需要n个判断。为什么不把这个职责交给类本身呢?然后让类提供一个接口访问。

2)作用

单例模式,能避免实例重复创建;

单例模式,应用于避免存在多个实例引起程序逻辑错误的场合;

单例模式,较节约内存。

2、单列模式(Singleton)的三种方式(其实还有枚举等)

懒汉式单例类
对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。
懒汉模式只在外部对象第一次请求实例的时候才去创建

/**
 * 懒汉式
 */
public class Demo_Layz {
    // 提供私有的访问方式
    private Demo_Layz() {
    }

    // 只创建成员变量不赋值
    private static Demo_Layz dl = null;
    
    //public static final Demo_Laz dl=new Demo_Layz();这是一个牛逼的方法!如果满分100,他就是120!

    public static Demo_Layz getInstance() {
        if (dl == null) {         //提高效率
            synchronized (Demo_Layz.class) {//保证对象的唯一性

                if (dl == null) {
                    dl = new Demo_Layz();
                }
            }
        }

        return dl;

    }

}

饿汉式单例
对于饿汉模式,我们可以这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。
/**
 * 饿汉式单列模式(一般我们使用单列模式一般都建议使用饿汉模式)
 */
public class A3 {
      private A3(){}    
    
     private  static A3 a=new A3();
    
     public  static A3 getIntance(){
        
         return a;
        
     }
    
}
/**
 * 单列模式的第三种模式
 */
public class A {

     private A(){}
    
    // 简单粗暴
    public static final A a =new A();
}