单例模式
构建方式
通常单例模式在Java语言中,有两种构建方式:
懒汉方式。指全局的单例实例在第一次被使用时构建。
饿汉方式。指全局的单例实例在类装载时构建。
例子
在Java语言中,单例模式(饿汉模式)应用的例子如下述代码所示:
publicclassSingleton{privatefinalstaticSingletonINSTANCE=newSingleton();// Private constructor suppresses privateSingleton(){}// default public constructorpublicstaticSingletongetInstance(){returnINSTANCE;}}
在Java编程语言中,单例模式(懒汉模式)应用的例子如下述代码所示 (此种方法只能用在JDK5及以后版本(注意 INSTANCE 被声明为 volatile),之前的版本使用“双重检查锁”会发生非预期行为 ):
publicclassSingleton{privatestaticvolatileSingletonINSTANCE=null;// Private constructor suppresses // default public constructorprivateSingleton(){}//thread safe and performance promote publicstaticSingletongetInstance(){if(INSTANCE==null){synchronized(Singleton.class){//when more than two threads run into the first null check same time, to avoid instanced more than one time, it needs to be checked again.if(INSTANCE==null){INSTANCE=newSingleton();}}}returnINSTANCE;}}
在C++编程语言中,单例模式应用的例子如下述代码所示(这里仅仅提供一个示例,这个例子对多线程的情况并不是安全的):
// ...classlock{public:lock();lock(lockconst&l);~lock();lock&operator=(lockconst&l);voidrequest();voidrelease();// ...};lock::lock(){// ...}// ...lock::~lock(){// ...}// ...voidlock::request(){// ...}voidlock::release(){// ...}// ...// assumes _DATA_TYPE_ has a default constructortemplateclasssingleton{public:static_DATA_TYPE_*request();staticvoidrelease();private:singleton();singleton(singletonconst&s);~singleton();singleton&operator=(singletonconst&s);static_DATA_TYPE_*pointer;staticlockmutex;// ...};template_DATA_TYPE_*singleton::pointer=0;templatelocksingleton::mutex;template_DATA_TYPE_*singleton::request(){if(singleton::pointer==0){singleton::mutex.request();if(singleton::pointer==0){singleton::pointer=new_DATA_TYPE_;}singleton::mutex.release();}returnsingleton::pointer;}templatevoidsingleton::release(){if(singleton::pointer!=0){singleton::mutex.request();if(singleton::pointer!=0){deletesingleton::pointer;singleton::pointer=0;}singleton::mutex.release();}}templatesingleton::singleton(){// ...}// ...intmain(){int*s;s=singleton::request();// ...singleton::release();return0;}
GO语言中的单例模式:
var_instance*servicetypeservicestruct{Namestring}funcService()*service{if_instance==nil{_instance=new(service)}return_instance}func(this*service)Startup(){}func(this*service)Stop(){}func(this*service)Restart(){}
OC语言中的单例模式:
@interfaceControl : NSObject+(id)getShare;@endstaticControl*mControl;@implementationControl+(id)getShare{if(mControl==nil){mControl=[[Controlalloc]init];}returnmControl;}-(id)init{//你需要初始化的属性。。。}@end
PHP语言中的单例模式:
classsingleton{privatefunction__construct(){}staticpublicfunctioninstance(){static$obj=null;if($obj===null){$obj=newself();}return$obj;}}?>
参见
多例模式
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值