`
mrjeye
  • 浏览: 177681 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

苛刻的单例

 
阅读更多
作为设计模式中最简单的一个,单例模式还是在很多系统中都会用到,总有那么一些实例,从始至终只需要它的一个实例,而且任何时候都要总方便的得到,像 Application 对象啦,环境对像啊。

要保持你设计的类别人只会初始出一个实例来,像 Java/C++/C# 中的做法一般希望能保证以下那些:

1. 构造方法藏起来,private 修饰,这样只能通过统一的工厂方法获得实例,因为 new 出来的总是新对象
2. 克隆方法出来的对象仍然是原来的对象
3. 反序列化出的对象也仍然是原来那个唯一的对象(这好像有点难)
4. 一般程序运行期间,该单实例不被释放
5. 一般要求工厂方法是原子性的,也是避免返回了不同的实例
6. 等等................. 是否还有些补充?

不一定每一点都真正考虑到,因为不是每个使用都都那么变态或不存在某些使用场景。

而我们这里的 Objective-C 有其语言的较大特殊性,是通过 alloc 来创建实例的,无法把构造方法 alloc 隐藏起来,但我们总是有办法的,可以做到:

1. 工厂方法返回唯一的实例
2. 多次调用 alloc 构造出的实例与 工厂方法得到的是同一个
3. 让你释放不掉这个实例,引用计数不让归零现在来看看 Objective-C 中的单例模式的代码实现吧:


//singleton.h
 
#import <Foundation/Foundation.h>
 
@interface Singleton : NSObject
{
 
}
 
+ (Singleton *) sharedInstance;
 
- (void) operation;
 
@end
 
//singleton.m
#import "Singleton.h"
 
@implementation Singleton
 
static Singleton *_sharedInstance = nil;
 
- (void) operation
{
  // do something
  NSLog(@"Singleton");
}
 
+ (Singleton *) sharedInstance
{
  if (_sharedInstance == nil)
  {
    _sharedInstance = [NSAllocateObject([self class], 0, NULL) init];
  }
  
  return _sharedInstance;
}
 
+ (id) allocWithZone:(NSZone *)zone
{
  return [[self sharedInstance] retain];
}
 
- (id) copyWithZone:(NSZone*)zone
{
  return self;
}
 
- (id) retain
{
  return self;
}
 
- (NSUInteger) retainCount
{
  return NSUIntegerMax; // denotes an object that cannot be released
}
 
- (oneway void) release
{
  // do nothing
}
 
- (id) autorelease
{
  return self;
}
 
@end


马上来看看效果,用下面的代码来分别得到 Singleton 的三个实例,s1, s2, s3:

 Singleton *s1 = [Singleton alloc];
    Singleton *s2 = [Singleton sharedInstance];
    Singleton *s3 = [Singleton alloc];
     
    NSLog(@"s1:%@, s2%@, s3%@", s1, s2, s3);


执行后打印出来的三个实例的地址是一样的:

s1:<Singleton: 0x100114890>, s2<Singleton: 0x100114890>, s3<Singleton: 0x100114890>

说明它们是同一个实例,无论是 alloc 还是 sharedInstance,好了现在对照着成功的案例可以放心的解释一下了:

1. 每一次 alloc 都得经过 allocWithZone: 方法,然后进到 sharedInstance 方法,这就统一了入口
2. release/autorelease/retainCount 方法保证了实例不被释放
3. copyWithZone: 和 retain 用以确保克隆还是保留的仍然是原来那个唯一的实例

再有更苛刻的条件就暂不考虑了,比如应该可以加上 @synchronized 来原子性一下。



from:http://unmi.cc/objective-c-dp-singleton
分享到:
评论

相关推荐

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,...

    单例多例模式

    "单例多例模式" 单例多例模式是软件设计中的一种重要概念,它们之间的区别和选择对系统的性能和稳定性有着重要的影响。本文将详细讲解单例多例模式的定义、产生方式、使用场景和选择标准。 一、什么是单例多例? ...

    unity中涉及的三种单例模式

    在Unity游戏开发中,单例模式是一种常用的编程设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在处理需要跨场景共享数据的情况时尤其有用,因为Unity的场景切换可能导致对象被销毁,而单例则...

    7种单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置对象等。下面将详细介绍七种常见的单例模式实现...

    OC单例模式讲解

    ### OC单例模式讲解 #### 一、单例模式简介 单例模式是设计模式中的一种,属于创建型模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Objective-C (简称OC)中,单例模式非常常用,尤其是在...

    单例省市级联

    在IT行业中,单例模式是一种常见的设计模式,它保证了一个类只有一个实例,并提供一个全局访问点。这样的设计在处理全局共享资源或者需要频繁创建和销毁的对象时特别有用,可以有效地节省系统资源,提高性能。本案例...

    C++单例设计模式,单例模式

    C++单例设计模式,单例模式 C++单例设计模式,单例模式

    C#单例模式详解 C#单例模式详解C#单例模式详解

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式常用于管理共享资源或控制类的实例化过程,以提高性能、节约系统资源,特别是在整个应用程序生命周期内只需要一...

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

    Qt多工程调用单例实现,带线程锁

    在本文中,我们将深入探讨如何在Qt环境中使用多工程调用单例模式,并结合线程锁来确保数据管理的一致性和安全性。首先,我们要理解单例设计模式是一种创建型设计模式,它保证一个类只有一个实例,并提供全局访问点。...

    运算符单例友元重载作业

    在编程领域,运算符单例友元重载是一种高级技巧,它涉及到面向对象设计模式、类的内部工作原理以及C++中的友元函数和运算符重载。让我们深入探讨这些概念,以便更好地理解和应用。 首先,我们要理解什么是“单例...

    QT静态单例管理信号和槽

    QT静态单例管理信号和槽是Qt框架中一种常见的设计模式,用于确保应用程序中只有一个特定类的实例。在Qt编程中,单例模式通常用于管理全局资源,如数据库连接、配置文件读取或系统设置。这里我们将深入探讨如何在Qt中...

    使用C++11实现线程安全的单例模式

    在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。线程安全的单例模式在多线程环境下尤其重要,因为不正确的实现可能导致多个线程创建多个实例,这违反了单例模式...

    设计模式——单例模式

    **设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...

    单例模式(饿汉模式、懒汉模式、DCL单例模式、枚举)

    单例模式是设计模式中的一种,它在软件工程中用于控制类的实例化过程,确保一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、缓存、日志记录等方面广泛应用。本文将详细讨论四种常见的单例实现方式:...

    java单例模式实例

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们...

    Android单例模式

    ### Android中的单例模式详解 #### 一、概念与特性 单例模式是软件工程中常用的设计模式之一,尤其在Java编程中非常普遍。它的核心在于确保某类在整个应用程序生命周期中仅存在一个实例,并且该类能全局访问该实例...

    Java单例类

    Java单例类是一种常见的设计模式,具有三个特点:单例类只能有一个实例、单例类必须自己创建自己的唯一实例、单例类必须给所有其他对象提供这一实例。单例模式可以分为三种:懒汉子式单例、饿汉子式单例、注册式单例...

    单例模式详解~~单例模式详解~~

    单例模式是一种设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,单例模式常用于控制资源的共享,比如数据库连接池、线程池或者日志系统等,这些资源通常需要全局唯一且高效地...

    c++单例模式线程日志类

    在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、...

Global site tag (gtag.js) - Google Analytics