欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式-单例模式-Java实现

程序员文章站 2022-03-07 17:06:24
...

1、单例模式

都2020年了,现在打游戏已经是件很平常的事了。有些游戏中,会有一些特殊的角色,他们在游戏中是唯一存在的,譬如一些特定的世界 BOSS,不同的玩家因为副本容量不够大进入到不同的副本中,打的却是同一个 BOSS。


这就是单例模式,顾名思义就是整个程序中只有一个实例对象。
单例模式有两种:

  1. 饿汉模式
  2. 饱汉模式

2、实例解析

假设要在程序中有类 Singleton,现在要通过单例模式使得程序中只能有一个该类的实例,主程序如下:

public class Main {
    public static void main(String[] args) {
        System.out.println("程序启动");
        Singleton s1 = Singleton.getInstance();
        Singleton s2 = Singleton.getInstance();
        if (s1 == s2) {
            System.out.println("s1和s2是相同的实例");
        } else {
            System.out.println("s1和s2是不同的实例");
        }
        System.out.println("程序结束");
    }
}

i、饿汉模式

饿汉模式,因为是饿汉,所以很着急想要获取这个实例,因此在类加载时就生成对应实例:

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton() {
        System.out.println("生成了一个实例");
    }
    public static Singleton getInstance(){
        return singleton;
    }
}

通过将构造函数的修饰符定义为 private 来避免用户新建对象。

ii、饱汉模式

饱汉模式,因为是饱汉,所以一点都不着急获取这个实例,因此在用到这个实例的时候再去生成对应实例:

public class Singleton {
	private static Singleton singleton;
	private Singleton(){
		System.out.println("生成了一个实例");
	}
	public static Singleton getInstance(){
		if(singleton==null){
			singleton = new Singleton();
		}
		return singleton;
	}
}

乍一看这么写没什么问题,但是其实是有问题的,在高并发的情况下,也许会多次执行 singleton = new Singleton(); 语句,从而产生问题,因此需要加锁:

public class Singleton {
	private static Singleton singleton;
	private Singleton(){
		System.out.println("生成了一个实例");
	}
	public static Singleton getInstance(){
		if(singleton==null){
			synchronized(Singleton.class){
				if(singleton==null){
					singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
}