数学与逻辑学中,singleton定义为“有且仅有一个元素的集合”。
单例模式最初的定义出现于《设计模式》(艾迪生维斯理, 1994):“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”
Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”
创建单例:
方法一:(保证不会多个线程同时创建)
1、private类型的无参构造,保证对象不能外部通过new来获得。
2、声明一个静态的此类的引用,不实例化。
3、创建一个public、静态的并且synchronized方法,返回值为此类。
类中如果此类的声明为空,则进行实例化。【供外部调用】
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。