【23种设计模式——单例模式】


数学与逻辑学中,singleton定义为“有且仅有一个元素的集合”。

单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”

Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”

创建单例:
方法一:(保证不会多个线程同时创建)
1、private类型的无参构造,保证对象不能外部通过new来获得。
2、声明一个静态的此类的引用,不实例化。
3、创建一个public、静态的并且synchronized方法,返回值为此类。
类中如果此类的声明为空,则进行实例化。【供外部调用】
package com.boco.rnop.vr.atest;

public class SingletonTest {

	// 单例模式方法一
	// 步骤一:创建私有空参构造,避免外部通过new创建实例
	private SingletonTest() {
	}
	
	//步骤二:声明一个对象的引用,并不创建实体
	private static SingletonTest instance = null;

	//步骤三:创建外部可以调用的方法,使用synchronized可以避免多线程调用发生冲突
	public static synchronized SingletonTest getInstance() {
		if (instance == null) {
			instance = new SingletonTest();
		}
		return instance;
	}
}

对结果进行打印:
package com.boco.rnop.vr.atest;

import java.lang.reflect.Constructor;

public class test {
	public static void main(String[] args) {
		
		//单例模式一
		SingletonTest c1 = SingletonTest.getInstance();
		SingletonTest c2 = SingletonTest.getInstance();
		System.out.println(c1 == c2);
		System.out.println(c1.equals(c2));
		
}
输出的结果都为true,说明指向的地址和实例都是一样的。

方法二:
1、private类型的无参构造。
2、创建一个私有的静态的对象。
3、创建一个public、静态的方法。返回2创建的实例,【供外部调用】。
package com.boco.rnop.vr.atest;

public class SingletonTest {

	// 单例模式方法二
	// 步骤一:内部创建一个静态的自己的实体
	private static SingletonTest SingletonTest = new SingletonTest();

	// 步骤二:创建空参构造
	private SingletonTest() {
	}

	// 步骤三:提供一个供外部访问本类的方法
	public static SingletonTest instanceSingletonTest() {
		return SingletonTest;
	}

}
结果打印
package com.boco.rnop.vr.atest;

import java.lang.reflect.Constructor;

public class test {
	public static void main(String[] args) {
		

		//单例模式二
		// 因为无参构造是私有的所以不允许使用new来进行实例化
		// Singleton c1 = new Singleton();
		Singleton c1 = Singleton.instanceSingleton();
		Singleton c2 = Singleton.instanceSingleton();
		System.out.println(c1 == c2);
		System.out.println(c1.equals(c2));
	}
}
输出都是true。






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