单例(Singleton)类
大部分都把类的构造器定义成public,允许任何类自由创建该类的对象。
但在某些时候,允许其他类自由创建该类的对象可能造成系统性能下降(因为频繁的创建对象,会产生回收对象带来的系统开销问题)
如果我们要求一个类只能创建一个实例,则这个类被称为单例类。
该类只能创建一个对象。
该类的构造器加private修饰,这样把该类的所有构造器隐藏起来。
提供一个static public方法作为该类的访问点,用于创建该类的对象
此外需要使用一个static 成员变量(保存曾经创建过的那个唯一的对象)。
调用单例类的方法:
建立新的instance时候用的是method XXX.getInstance()
写代码的时候注意检查,单例类构建代码应会出现2处static,2处private关键字。
- constructor有关的设置只加private
- instance有关的设置都加static
-
- 首次定义的instance除了static还要有private
-
- getInstance()只是static标注
下面是一个典型的创建一个Singleton的例子:
package ThreadSafe;
public class SingletonTest {
public static void main(String[] args) {
//创建Singleton对象不能通过构造器
//只能通过getInstance方法得到实例
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1==s2); //输出结果为true
// 因为Singleton类只能产生一个实例,所以上面两次产生的对象实际上是同一个对象
}
}
class Singleton{
//使用一个类变量 缓存曾经创建的实例
private static Singleton instance;
//对构造器使用private修饰,隐藏该构造器
private Singleton(){}
//提供一个静态方法,用于返回Singleton实例
//该方法能够控制保证只能产生一个Singleton对象
public static Singleton getInstance(){
//如果instance为null,则表明还不曾创建Singleton对象
//如果instance不为null,则表明已经创建Singleton对象,就不会再创建新的实例
if(instance == null){
//创建一个Singleton对象,并将其缓存起来
instance = new Singleton();
}
return instance;
}
}
运行结果(因为单例类的两个对象其实就是同一个对象,所以得到true)
true
Process finished with exit code 0