java中的单例模式-饿汉模式与懒汉模式的介绍

98 阅读2分钟

java中单例设计模式

单例设计模式的目的:希望在程序运行过程中只创建一个对象。

单例设计模式有两种表达方式:

  1. 饿汉模式
  2. 懒汉模式

两者之间的区别:

  1. 二者最主要的区别在于创建对象的时机不同:饿汉式是在类加载就创建了对象实例,而懒汉式是在使用时才创建。
  2. 饿汉式不存在线程安全问题,懒汉式存在线程安全问题。
  3. 饿汉式存在浪费资源的可能。因为如果程序员一个对象实例都没有使用,那么饿汉式创建的对象就浪费了,懒汉式是使用时才创建,就不存在这个问题。
  4. 在我们javaSE标准类中,java.lang.Runtime就是经典的单例模式。

饿汉模式的实现

解释:饿汉模式,创建对象的方法上使用了 static关键字,在类加载的时候就行了创建,如下代码所示,不管调用多少次getInstance()方法,在同一个程序中,类只加载了一次,所以构造器只调用了一次,非常的专一,在多线程中,不会受到其他线程的影响,因为对象只创建了一次,而且是在类加载的时候。

创建步骤:

  1. 将构造器私有化
  2. 在类的内部直接创建对象(该对象是static修饰)
  3. 提供一个公共的static方法,返回gf对象
package JavaTest;
public class 饿汉模式 {
    public static void main(String[] args) {
        GirlFriend gf1 = GirlFriend.getInstance();
        GirlFriend gf2 = GirlFriend.getInstance();
        System.out.println(gf1);
        System.out.println(gf2);
    }
}

class GirlFriend {
    private String name ;
    public static final int n1= 100;
    private static GirlFriend gf = new GirlFriend("小红");
    public GirlFriend() {
    }
    public GirlFriend(String name) {
        System.out.println("构造器被调用了~");
        this.name = name;
    }
    public void showGirlfriend() {

    }
    public static GirlFriend getInstance() {
        return gf;
    }
    public static void setInstance(GirlFriend gf) {
        GirlFriend.gf = gf;
    }
    @Override
    public String toString() {
        return "GirlFriend{" +
                "name='" + name + '\'' +
                '}';
    }
}

饿汉模式测试结果

饿汉模式.png

懒汉模式的实现

目的:只有在用户调用的时候才会进行创建,通过if判断,对象是否存在,来进行创建对象,保证了对象之被创建一次。

实现步骤

  1. 将构造器私有化
  2. 定义一个static静态属性对象
  3. 提供一个public static方法,可以返回一个对象
  4. 只有当用户调用getInstance方法时,才能返回对象,后面再次调用,会返回上次创建的对象,保证了单例
package JavaTest;

public class 懒汉模式模拟 {
    public static void main(String[] args) {
        Dog dog2 = Dog.getInstance();
        Dog dog1 = Dog.getInstance();
        System.out.println(dog1.getName());
        System.out.println(dog2.getName());
    }
}
class Dog {
    private String name;
    private static Dog dog ;

    public Dog(String name) {
        System.out.println("构造器被调用了");
        this.name = name;
    }
    public static Dog getInstance() {
        if(dog==null) {
            dog = new Dog("旺财");
        }
        return dog;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

懒汉模式测试结果

懒汉模式.png