创建一个单件实例

转载 2012年03月29日 16:48:08
Foundation和Application Kit框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManagerNSWorkspace类在使用时都是基于进程进行单件对象的实例化。当您向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。

单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果您的类在概念上只有一个实例(比如NSWorkspace),就应该产生一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法或函数。

创建单件实例时,您需要在代码中执行下面的工作:

  • 声明一个单件对象的静态实例,并初始化为nil

  • 在该类的类工厂方法(名称类似于“sharedInstance”或“sharedManager”)中生成该类的一个实例,但仅当静态实例为nil的时候。

  • 重载allocWithZone:方法,确保当用户试图直接(而不是通过类工厂方法)分配或初始化类的实例时,不会分配出另一个对象。

  • 实现基本协议方法:copyWithZone:releaseretainretainCount、和autorelease ,以保证单件的状态。

列表2-15 显示如何实现一个单件:

static MyGizmoClass *sharedGizmoManager = nil;

 

+ (MyGizmoClass*)sharedManager

{

    @synchronized(self) {

        if (sharedGizmoManager == nil) {

            [[self alloc] init]; // assignment not done here

        }

    }

    return sharedGizmoManager;

}

 

+ (id)allocWithZone:(NSZone *)zone

{

    @synchronized(self) {

        if (sharedGizmoManager == nil) {

            sharedGizmoManager = [super allocWithZone:zone];

            return sharedGizmoManager;  // assignment and return on first allocation

        }

    }

    return nil; //on subsequent allocation attempts return nil

}

 

- (id)copyWithZone:(NSZone *)zone

{

    return self;

}

 

- (id)retain

{

    return self;

}

 

- (unsigned)retainCount

{

    return UINT_MAX;  //denotes an object that cannot be released

}

 

- (void)release

{

    //do nothing

}

 

- (id)autorelease

{

    return self;

}

当您需要一个单件实例(由类工厂方法来创建和控制),又需要通过分配和初始化创建其它实例时,就可能出现问题。在这种情况下,您不必重载allocWithZone: 及其后的其它方法,如列表2-15所示。

点击打开链接


单件模式的C++实现

单件模式是一种用于确保整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享时的程序设计方法(根据实际情况,可能需要几个类实例)。在某些情况下,这种程序设计方法是很有用处的。 Sin...
  • luoluoxiaocainiao
  • luoluoxiaocainiao
  • 2014年02月26日 21:16
  • 1250

单件模式(Singleton Pattern)(一):单件模式介绍

一、意图          单件模式(又称单例模式)确保一个类只有一个实例,并提供一个全局访问点。 二、适用性 1.当类只能有一个实例而且客户可以从一个众所周知的访问点访问...
  • jialinqiang
  • jialinqiang
  • 2013年05月11日 09:23
  • 4005

Python中的Singleton (单件)模式

 我知道的一种在python中Singleton mode的实现如下:class Foo: passdefinstance():    global inst    try:        inst ...
  • zylcf818
  • zylcf818
  • 2010年03月03日 14:42
  • 1992

C++ 单件模式实现及对象释放

单件模式: 单件模式即在整个应用程序中只有一个类实例且这个实例所占资源在整个应用程序中是共享的。 单件模式的C++实现(构造函数、拷贝构造函数、赋值操作符均需重写): #include clas...
  • zxwangyun
  • zxwangyun
  • 2014年06月10日 13:52
  • 1549

多线程安全的Singleton单件模式在C++,java与C#下的实现

单件模式就是全局只能被创建一个对象,在没有多线程的情况粗糙的代码还可以     class Singleton { private: static Singleton* Instanc...
  • XiaoPANGXia
  • XiaoPANGXia
  • 2015年04月18日 22:39
  • 1367

单件实例

Foundation和Application Kit框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager和NSWorkspace类在使用时都是基于进程...
  • yangwei_yang
  • yangwei_yang
  • 2015年03月07日 20:24
  • 272

单件类(C++)理解

单件类在任何时候最多只有一个实例对象,因此我们必须保证单件类只能被new一次。可以把类的构造函数声明为private,所以new只能出现在类成员函数中。然后在类内部定义一个静态的函数控制引用次数。...
  • anye3000
  • anye3000
  • 2010年03月17日 15:56
  • 3387

C++单件模式的实现

单件模式:其实就是保证了一个类有且仅有一个对像,又提供一个全局访问方法。对某些类来说,希望它只有一个对像,那么用单件模式设计再好不过了。很多人在刚开始时不知道Ogre中getSingleton()、g...
  • fanwenyuan_fwy
  • fanwenyuan_fwy
  • 2014年08月08日 11:49
  • 520

单件类的实现

#include #include #include #include "string" using namespace std; class example_singletom; templa...
  • wuan584974722
  • wuan584974722
  • 2016年11月25日 21:42
  • 233

Python单件模式

class A: @classmethod def instance(cls): if not hasattr(cls, '_in...
  • ht8269
  • ht8269
  • 2010年07月20日 16:48
  • 950
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创建一个单件实例
举报原因:
原因补充:

(最多只允许输入30个字)