Java-设计模式-单例模式浅谈

《\(^o^)/》

单例模式 (Singleton)

单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。

通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个好的办法就是,让类自身负责保存他的唯一实例。这个类可以保证没有其他实例可以被创建,并且他可以提供一个访问该实例的方法。

单例模式应用的举例
任务管理器,当你打开你电脑的任务管理器时,会弹出一个对话框。
如果你再去打开任务管理器,就没有新的对话框弹出了。出现在你电脑上的任务管理器只有一个。

单例模式的好处
1.保证一个类仅有一个实例。
2.节省内存,因为它限制了实例的个数,有利于Java垃圾回收

单例模式的实现

  • 饿汉模式
    • 在类加载的时候立即创建该类的单例
    • 如果这个单例在今后一段时间都不使用的话,会浪费大量的时间和空间
  • 懒汉模式
    • 只有需要产生这个实例的时候才去产生
    • 今后再需要的时候,直接返回第一次创建好的实例即可。

看如下例子:
实现两数求和。

饿汉模式
方法类

package 单例模式;
/*
 * 步骤:【创建】一个私有的静态的当前类的对象。
 *      同时将该类的构造方法设定为私有的。
 *      然后提供公共的静态的一个方法 getObj() 去访问私有的静态变量
 */
public class MyClass {
    private static MyClass mc = new MyClass();
    private MyClass(){

    }
    public static MyClass getObj(){
        return mc;
    }
    public int add(int x,int y){
        return x+y;
    }
}

测试类

package 单例模式;

public class TestMyClass {

    public static void main(String[] args) {
        //实例化m1,m2
        MyClass m1 = MyClass.getObj();
        MyClass m2 = MyClass.getObj();
        //如果 (m1==m2) 返回 true 说明m1和m2地址相同。
        //也就是说他们取到的都是方法类中创建的对象mc,实现了单例。
        //如果返回false,则没有实现。
        System.out.println(m1==m2);
        //还可以通过查看比较两个对象的hash码
        System.out.println(m1.toString());
        System.out.println(m2.toString());
        //使用方法求和
        System.out.println(m1.add(10, 90));
    }

}

运行结果

这里写图片描述

懒汉模式
方法类

package 单例模式;
/*
 * 步骤:【声明】一个私有的静态的当前类的对象。
 *      同时将构造方法设为私有
 *      然后提供公共的静态的一个方法 getBbj() 去访问私有的静态变量
 *      在这个方法中判断对象是否被创建,
 *      如果已经被创建,直接使用
 *      如果未被创建,先创建,再使用
 */
public class MyClass2 {
    private static MyClass2 mc ;
    private MyClass2(){

    }
    public static MyClass2 getObj(){
        if(mc==null){
            mc=new MyClass2();
        }
        return mc;
    }
    public int add(int x,int y){
        return x+y;
    }
}

测试类

package 单例模式;

public class TestMyClass {

    public static void main(String[] args) {
        MyClass2 m3 = MyClass2.getObj();
        MyClass2 m4 = MyClass2.getObj();
        System.out.println(m3==m4);
        System.out.println(m3.toString());
        System.out.println(m4.toString());
        System.out.println(m4.add(10, 90));
    }

}

运行结果
这里写图片描述

通过单例模式的两种模式比较,可以看出
懒汉模式是在需要的时候被创建,而饿汉模式是从开始就一直存在着。
懒汉模式可以理解为 我想吃,但是我懒。有饭,我才会张开嘴。
饿汉模式可以理解为 我很饿,我真的饿。喂我,嘴一直张着呢。

你可能感兴趣的:(设计模式)