fbpx
维基百科

单例模式

单例模式,也叫单子模式,是一种常用的软件设计模式[1],属于创建型模式的一种。在应用这个模式时,单例对象的必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

單例模式的UML類別圖

实现单例模式的思路是:一个类能返回对象一个引用(永远是同一个)和一个获得该实例的方法(必须是静态方法,通常使用getInstance这个名称);当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用;同时我们还将该类的构造函数定义为私有方法,这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例。

单例模式在多线程的应用场合下必须小心使用。如果当唯一实例尚未创建时,有两个线程同时调用创建方法,那么它们同时没有检测到唯一实例的存在,从而同时各自创建了一个实例,这样就有两个实例被构造出来,从而违反了单例模式中实例唯一的原则。 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁(虽然这样会降低效率)。

构建方式 编辑

通常单例模式在Java语言中,有两种构建方式:

  • 懒汉方式。指全局的单例实例在第一次被使用时构建。
  • 饿汉方式。指全局的单例实例在类装载时构建。

例子 编辑

Java 编辑

Java语言中,单例模式(饿汉模式)应用的例子如下述代码所示:

 public class Singleton {  private static final Singleton INSTANCE = new Singleton();    // Private constructor suppresses  // default public constructor  private Singleton() {};    public static Singleton getInstance() {  return INSTANCE;  }  } 

Java编程语言中,单例模式(懒汉模式)应用的例子如下述代码所示 (此种方法只能用在JDK5及以后版本(注意 INSTANCE 被声明为 volatile),之前的版本使用“双重检查锁”会发生非预期行为[2]):

 public class Singleton {  private static volatile Singleton INSTANCE = null;    // Private constructor suppresses   // default public constructor  private Singleton() {};    //Thread safe and performance promote   public static Singleton getInstance() {  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 = new Singleton();   }   }   }  return INSTANCE;  }  } 

C++ 编辑

C++编程语言中,单例模式应用的例子如下述代码所示(这里仅仅提供一个示例;由于加入了锁,这代码是线程安全的):

// ... class lock {  public:  lock();  lock(lock const & l);  ~lock();  lock & operator =(lock const & l);  void request();  void release();  // ... }; lock::lock() {  // ... } // ... lock::~lock() {  // ... } // ... void lock::request() {  // ... } void lock::release() {  // ... } // ... // assumes _DATA_TYPE_ has a default constructor template<typename _DATA_TYPE_> class singleton {  public:  static _DATA_TYPE_ * request();  static void release();  private:  singleton();  singleton(singleton<_DATA_TYPE_> const & s);  ~singleton();  singleton<_DATA_TYPE_> & operator =(singleton<_DATA_TYPE_> const & s);  static _DATA_TYPE_ * pointer;  static lock mutex;  // ... }; template<typename _DATA_TYPE_> _DATA_TYPE_ * singleton<_DATA_TYPE_>::pointer = nullptr; template<typename _DATA_TYPE_> lock singleton<_DATA_TYPE_>::mutex; template<typename _DATA_TYPE_> _DATA_TYPE_ * singleton<_DATA_TYPE_>::request() {  if(singleton<_DATA_TYPE_>::pointer == nullptr)  {  singleton<_DATA_TYPE_>::mutex.request();  if(singleton<_DATA_TYPE_>::pointer == nullptr)  {  singleton<_DATA_TYPE_>::pointer = new _DATA_TYPE_;  }  singleton<_DATA_TYPE_>::mutex.release();  }  return singleton<_DATA_TYPE_>::pointer; } template<typename _DATA_TYPE_> void singleton<_DATA_TYPE_>::release() {  if(singleton<_DATA_TYPE_>::pointer != nullptr)  {  singleton<_DATA_TYPE_>::mutex.request();  if(singleton<_DATA_TYPE_>::pointer != nullptr)  {  delete singleton<_DATA_TYPE_>::pointer;    singleton<_DATA_TYPE_>::pointer = nullptr;  }  singleton<_DATA_TYPE_>::mutex.release();  } } template<typename _DATA_TYPE_> singleton<_DATA_TYPE_>::singleton() {  // ... } // ... int main() {  int * s;  s = singleton<int>::request();  // ...  singleton<int>::release();  return 0; } 

GO 编辑

GO语言中的单例模式:

var _instance *service var once sync.Once type service struct { Name string } func Service() *service { once.Do(func() {   _instance = &service{}  }) return _instance } func (this *service) Startup() { } func (this *service) Stop() { } func (this *service) Restart() { } 

Objective-C 编辑

OC语言中的单例模式:

@interface Control : NSObject +(id)getShare; @end static Control *mControl; @implementation Control +(id)getShare {  if (mControl == nil) {  mControl = [[Control alloc] init];  }  return mControl; } -(id)init { //你需要初始化的属性。。。 } @end 

PHP 编辑

PHP语言中的单例模式:

<?php class singleton { private function __construct() { } static public function instance() { static $obj = null; if($obj === null) {  $obj = new self(); } return $obj; } } ?> 

参考文献 编辑

  1. ^ Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software . Addison Wesley. 1994: 127ff. ISBN 0-201-63361-2. 
  2. ^ David Bacon,Joshua Bloch etc. The "Double-Checked Locking is Broken" Declaration. [2012-08-17]. (原始内容存档于2012-03-01) (英语). 

外部链接 编辑

  • (java.sun.com)
  • Java单例对象同步问题探讨 (页面存档备份,存于互联网档案馆

参见 编辑


单例模式, 此條目需要补充更多来源, 2018年10月22日, 请协助補充多方面可靠来源以改善这篇条目, 无法查证的内容可能會因為异议提出而被移除, 致使用者, 请搜索一下条目的标题, 来源搜索, 网页, 新闻, 书籍, 学术, 图像, 以检查网络上是否存在该主题的更多可靠来源, 判定指引, 也叫单子模式, 是一种常用的软件设计模式, 属于创建型模式的一种, 在应用这个模式时, 单例对象的类必须保证只有一个实例存在, 许多时候整个系统只需要拥有一个的全局对象, 这样有利于我们协调系统整体的行为, 比如在某个服务器程. 此條目需要补充更多来源 2018年10月22日 请协助補充多方面可靠来源以改善这篇条目 无法查证的内容可能會因為异议提出而被移除 致使用者 请搜索一下条目的标题 来源搜索 单例模式 网页 新闻 书籍 学术 图像 以检查网络上是否存在该主题的更多可靠来源 判定指引 单例模式 也叫单子模式 是一种常用的软件设计模式 1 属于创建型模式的一种 在应用这个模式时 单例对象的类必须保证只有一个实例存在 许多时候整个系统只需要拥有一个的全局对象 这样有利于我们协调系统整体的行为 比如在某个服务器程序中 该服务器的配置信息存放在一个文件中 这些配置数据由一个单例对象统一读取 然后服务进程中的其他对象再通过这个单例对象获取这些配置信息 这种方式简化了在复杂环境下的配置管理 單例模式的UML類別圖 实现单例模式的思路是 一个类能返回对象一个引用 永远是同一个 和一个获得该实例的方法 必须是静态方法 通常使用getInstance这个名称 当我们调用这个方法时 如果类持有的引用不为空就返回这个引用 如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用 同时我们还将该类的构造函数定义为私有方法 这样其他处的代码就无法通过调用该类的构造函数来实例化该类的对象 只有通过该类提供的静态方法来得到该类的唯一实例 单例模式在多线程的应用场合下必须小心使用 如果当唯一实例尚未创建时 有两个线程同时调用创建方法 那么它们同时没有检测到唯一实例的存在 从而同时各自创建了一个实例 这样就有两个实例被构造出来 从而违反了单例模式中实例唯一的原则 解决这个问题的办法是为指示类是否已经实例化的变量提供一个互斥锁 虽然这样会降低效率 目录 1 构建方式 2 例子 2 1 Java 2 2 C 2 3 GO 2 4 Objective C 2 5 PHP 3 参考文献 4 外部链接 5 参见构建方式 编辑通常单例模式在Java语言中 有两种构建方式 懒汉方式 指全局的单例实例在第一次被使用时构建 饿汉方式 指全局的单例实例在类装载时构建 例子 编辑Java 编辑 在Java语言中 单例模式 饿汉模式 应用的例子如下述代码所示 public class Singleton private static final Singleton INSTANCE new Singleton Private constructor suppresses default public constructor private Singleton public static Singleton getInstance return INSTANCE 在Java编程语言中 单例模式 懒汉模式 应用的例子如下述代码所示 此种方法只能用在JDK5及以后版本 注意 INSTANCE 被声明为 volatile 之前的版本使用 双重检查锁 会发生非预期行为 2 public class Singleton private static volatile Singleton INSTANCE null Private constructor suppresses default public constructor private Singleton Thread safe and performance promote public static Singleton getInstance 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 new Singleton return INSTANCE C 编辑 在C 编程语言中 单例模式应用的例子如下述代码所示 这里仅仅提供一个示例 由于加入了锁 这代码是线程安全的 class lock public lock lock lock const amp l lock lock amp operator lock const amp l void request void release lock lock lock lock void lock request void lock release assumes DATA TYPE has a default constructor template lt typename DATA TYPE gt class singleton public static DATA TYPE request static void release private singleton singleton singleton lt DATA TYPE gt const amp s singleton singleton lt DATA TYPE gt amp operator singleton lt DATA TYPE gt const amp s static DATA TYPE pointer static lock mutex template lt typename DATA TYPE gt DATA TYPE singleton lt DATA TYPE gt pointer nullptr template lt typename DATA TYPE gt lock singleton lt DATA TYPE gt mutex template lt typename DATA TYPE gt DATA TYPE singleton lt DATA TYPE gt request if singleton lt DATA TYPE gt pointer nullptr singleton lt DATA TYPE gt mutex request if singleton lt DATA TYPE gt pointer nullptr singleton lt DATA TYPE gt pointer new DATA TYPE singleton lt DATA TYPE gt mutex release return singleton lt DATA TYPE gt pointer template lt typename DATA TYPE gt void singleton lt DATA TYPE gt release if singleton lt DATA TYPE gt pointer nullptr singleton lt DATA TYPE gt mutex request if singleton lt DATA TYPE gt pointer nullptr delete singleton lt DATA TYPE gt pointer singleton lt DATA TYPE gt pointer nullptr singleton lt DATA TYPE gt mutex release template lt typename DATA TYPE gt singleton lt DATA TYPE gt singleton int main int s s singleton lt int gt request singleton lt int gt release return 0 GO 编辑 GO语言中的单例模式 var instance service var once sync Once type service struct Name string func Service service once Do func instance amp service return instance func this service Startup func this service Stop func this service Restart Objective C 编辑 OC语言中的单例模式 interface Control NSObject id getShare end static Control mControl implementation Control id getShare if mControl nil mControl Control alloc init return mControl id init 你需要初始化的属性 end PHP 编辑 PHP语言中的单例模式 lt php class singleton private function construct static public function instance static obj null if obj null obj new self return obj gt 参考文献 编辑 Erich Gamma Richard Helm Ralph Johnson John Vlissides Design Patterns Elements of Reusable Object Oriented Software nbsp Addison Wesley 1994 127ff ISBN 0 201 63361 2 含有內容需登入查看的頁面 link David Bacon Joshua Bloch etc The Double Checked Locking is Broken Declaration 2012 08 17 原始内容存档于2012 03 01 英语 外部链接 编辑A Q amp A page java sun com Java单例对象同步问题探讨 页面存档备份 存于互联网档案馆 参见 编辑設計模式 多例模式 取自 https zh wikipedia org w index php title 单例模式 amp oldid 79183919, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。