单子类是一个在程序的生命周期内只创建一个对象实例的类。
在Java中,单子类是一个实现了单子设计模式的普通类,只允许创建一个类的实例。
下面是Java中单例类的设计模式:
- 该类必须提供一个全局访问点来获取该类的实例。这通常是通过一个返回该类实例的
public static方法来实现的。 - 该类必须只有一个
private构造函数。一个private构造函数只能被该类访问,所以这确保了该类能控制实例的创建。 - 该类必须有一个
private static属性来存储该类的实例。
下面的代码显示了一个名为Single 的单子类的例子:
class Single {
// Create an instance of the Single class
// save it inside a private static attribute
private static Single singleton = new Single();
// A private Constructor
// ensures only one instance created
private Single() {}
// Access to the class instance here
public static Single getInstance() {
return singleton;
}
}
上面的代码是一个用早期实例化策略实现的单子类基本结构。
当你用上面定义的单子类运行程序时,一旦该类被加载,就会立即创建一个新的实例。
如果你想进一步优化单子类,你可以采用懒惰实例化策略。
当getInstance() 方法第一次被调用时,该实例将被创建:
class Single {
private static Single singleton = null;
private Single() {}
// Lazy instantiation
public static Single getInstance() {
if (singleton == null) {
singleton = new Single();
}
return singleton;
}
}
singleton 实例将被初始化为null 。实例将在第一次调用getInstance() 方法时被创建。
要访问该类的实例,你要调用该类的getInstance() 方法。
在下面的例子中,a 和b 将指代同一个对象:
Single a = Single.getInstance();
Single b = Single.getInstance();
一个创建类的实例的方法也被称为工厂方法。上面的getInstance() 方法就是工厂方法的一个例子。
你可以向单子类添加属性和方法,就像其他正常的Java类一样:
class Single {
private static Single singleton = null;
private Single() {
}
public static Single getInstance() {
if (singleton == null) {
singleton = new Single();
}
return singleton;
}
// Add attributes and methods
String name = "Nathan";
void greetings(){
System.out.println("Hello World!");
}
}
你可以按以下方式访问单子类的属性和方法:
Single objInstance = Single.getInstance();
objInstance.addressee = "John";
objInstance.greetings(); // Hello, John!
这就是你如何在Java中创建一个单子类。
当你需要控制对类实例的访问时,通常会定义一个单子类,将对象的创建数量限制在一个。