设计模式学习——单例模式

获取单例模式的几种推荐方法

一、通过静态代码块来获取单例对象

public class SingletonTest {
	public static void main(String[] args) {
		Singleton singleton1 = Singleton.getSingleton();
		Singleton singleton2 = Singleton.getSingleton();
		//比较两个对象是否相等
		System.out.println(singleton1.hashCode());
		System.out.println(singleton2.hashCode());
	}
}

/**
 * 将要获取的单例对象
 */
class Singleton {
//单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象
	private Singleton() {
	}

	private static Singleton singleton;

	static {
		//静态代码块中创建对象
		singleton = new Singleton();
	}

	/**
	 * 	提供公有方法来获取单例对象
	 */
	public static Singleton getSingleton() {
		return singleton;
	}
}

缺点:对内存消耗较大

推荐在单线程中,且能确定所有类的对象都会被创建时使用


多线程下推荐的创建单例的方法

二、通过双重检测来获取单例对象

public class SingletonTest {
	public static void main(String[] args) {
		Singleton singleton1 = Singleton.getSingleton();
		Singleton singleton2 = Singleton.getSingleton();
		//比较两个对象是否相等
		System.out.println(singleton1.hashCode());
		System.out.println(singleton2.hashCode());
	}
}

/**
 * 将要获取的单例对象
 */
class Singleton {
	//单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象

	private Singleton() {
	}

	private static volatile Singleton singleton;

	/**
	 * 双重检测,保证多线程下的单例
	 */
	public static Singleton getSingleton() {
		if(singleton == null) {
			synchronized (Singleton.class) {
				if(singleton == null) {
					singleton = new Singleton();
				}
			}
		}
		return singleton;
	}
}

三、通过静态内部类来创建单例对象

public class SingletonTest {
	public static void main(String[] args) {
		Singleton singleton1 = Singleton.getSingleton();
		Singleton singleton2 = Singleton.getSingleton();
		//比较两个对象是否相等
		System.out.println(singleton1.hashCode());
		System.out.println(singleton2.hashCode());
	}
}

/**
 * 将要获取的单例对象
 */
class Singleton {
	//单例模式中都要将构造方法设置为私有构造方法,避免通过new的方法来获取对象

	private Singleton() {
	}

	/**
	 * 在静态内部类中创建单例对象
	 */
	static class GetSingleton {
		private static final Singleton SINGLETON = new Singleton();
	}


	public static Singleton getSingleton() {
		return GetSingleton.SINGLETON;
	}
}

四、通过枚举的方法获取单例对象

public class SingletonTest {
	public static void main(String[] args) {
		Singleton singleton1 = Singleton.INSTANCE;
		Singleton singleton2 = Singleton.INSTANCE;
		singleton1.say();
		//比较两个对象是否相等
		System.out.println(singleton1.hashCode());
		System.out.println(singleton2.hashCode());
	}
}


enum Singleton {
	/**
	 * 将要获取的单例对象
	 */
	INSTANCE;
	public void say() {
		System.out.println("hello world");
	}
}
posted @ 2020-02-20 15:05  NyimaC  阅读(105)  评论(0编辑  收藏  举报