第52章
小a:“师兄,单体模式的实现要怎么去实现?”
大b:“1、提供唯一的私有构造器,避免多个单体(singleton)对象被创建,这也意味着该单体类不能有子类,那声明你的单例类为final是一个好主意,这样意图明确,并且让编译器去使用一些性能优化选项。如果有子类的话使用protected,protected的构造方法可以被其子类以及在同一个包中的其它类调用。私有构造器可以防止客户程序员通过除由我们提供的方法之外的任意方式来创建一个实例,如果不把构造器声明为private或protected,编译器会自动的创建一个public的构造函数。2、使用静态域(staticfield)来维护实例。将单体对象作为单体类的一个静态域实例化。使用保存唯一实例的static变量,其类型就是单例类型本身。需要的话使用final,使其不能够被重载。”
例如:privatestaticrutimecurrentruntime=newruntime();
大b:“3、使用静态方法(staticmethod)来监视实例的创建。”
(1)加载时实例化
例如:
publicclasssingleton{
privatestaticfinalsingletonsingletoninstance=newsingleton();
privatesingleton(){
}
publicstaticsynchronizedsingletongetinstance(){
returnsingletoninstance;
}
}
publicclasssingleton{
privatestaticfinalsingleton?singletoninstance=newsingleton();
privatesingleton(){
}
publicstaticsynchronizedsingletongetinstance(){
returnsingletoninstance;
}
}
(2)使用时实例化(惰性初始化):这样做可以在运行时收集需要的信息来实例化单体对象,确保实例只有在需要时才被建立出来。
例如:
publicclasssingleton{
privatestaticfinalsingletonsingletoninstance=null;
privatesingleton(){
//使用运行时收集到的需要的信息,进行属性的初始化等操作。
}
publicstaticsynchronizedsingletongetinstance(){
if(singletoninstance……null){
singletoninstance=newsingleton();
}
returnsingletoninstance;
}
}
publicclasssingleton{
privatestaticfinalsingletonsingletoninstance=null;
privatesingleton(){
//使用运行时收集到的需要的信息,进行属性的初始化等操作。
}
publicstaticsynchronizedsingletongetinstance(){
if(singletoninstance……null){
singletoninstance=newsingleton();
}
returnsingletoninstance;
}
}
大b:“4、单体对象的成员变量(属性):即单体对象的状态通过单例对象的初始化来实现成员变量的初始化。通过方法对单体对象的成员变量进行更新操作。”
例如:
publicclasssingleton{
privatestaticfinalsingletonsingletoninstance=null;
privatevectorproperties=null;
protectedsingleton(){
//使用运行时收集到的需要的信息,进行属性的初始化等操作。
}
privatestaticsynchronizedvoidsyncinit(){
if(singletoninstance……null){
singletoninstance=newsingleton();
}
}
publicstaticsingletongetinstance(){
if(singletoninstance……null){
syncinit();
}
returnsingletoninstance;
}
publicsynchronizedvoidupdateproperties(){
//更新属性的操作。
}
publicvectorgetproperties(){
returnproperties;
}
}
publicclasssingleton{
privatestaticfinalsingletonsingletoninstance=null;
privatevectorproperties=null;
protectedsingleton(){
//使用运行时收集到的需要的信息,进行属性的初始化等操作。
}
privatestaticsynchronizedvoidsyncinit(){
if(singletoninstance……null){
singletoninstance=newsingleton();
}
}
publicstaticsingletongetinstance(){
if(singletoninstance……null){
syncinit();
}
returnsingletoninstance;
}
publicsynchronizedvoidupdateproperties(){
//更新属性的操作。
}
publicvectorgetproperties(){
returnproperties;
}
}