Singleton类和Singleton方法之间的区别?

第c天

我有一个问题。

单例类和单例方法之间有什么区别。我已经创建了共享实例方法,如果我使用alloc方法,是否会创建新实例?提前致谢

“单身模式”(或“单身类”或仅仅是“单身”)就是任何只允许您拥有单个实例的类。

“单一方法”指的是一种为访问实例而编写的方法。(现在,在Swift和Objective-C中,公共接口将声明一个属性来访问单例,而不是方法,但想法是相同的。)

传统上,“单例模式”是指仅不允许创建其他实例的类。但是应该注意,在存在单个共享实例的情况下,有时有时会更宽松地使用术语“单身”,但实际上您也可以允许创建自己的实例。一个示例就是NSURLSession,其sharedSession属性在Apple文档中称为“单个”,但仍然允许创建自己的自定义NSURLSession会话。

最重要的是,是否以可以实例化或无法实例化其他实例的方式设计单例,这是类设计的问题。(许多人坚持认为这就是“单身”的意思。我将不参加辩论。)在许多情况下,我们明确希望避免发生意外的创建实例。但是,在其他(较罕见)的情况下,您可能既要允许单例,又要允许创建其他实例的能力。这只是单身人士班级意图的问题。


请注意,您的问题最初被标记为一个Objective-C实现可能如下所示:

NS_ASSUME_NONNULL_BEGIN

@interface Foo : NSObject

@property (class, strong, readonly) Foo *sharedFoo;

- (instancetype)init __attribute__((unavailable("Use +[Foo sharedFoo] instead")));
+ (instancetype)new __attribute__((unavailable("Use +[Foo sharedFoo] instead")));

@end

NS_ASSUME_NONNULL_END

@implementation Foo

+ (Foo *)sharedFoo {
    static Foo *sharedFoo = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedFoo = [[self alloc] init];
    });
    return sharedFoo;
}

- (id)init {
    if ((self = [super init])) {
        // do additional initialization here
    }
    return self;
}

@end

注意:

  1. 如今,人们通常会定义要通过@property公共接口中的单例而不是方法来访问的单例将该属性声明为classreadonly,然后您将为该属性手动实现getter访问器方法。

    通过将此公共接口定义为属性而不是方法,如果您曾经通过Swift与该对象进行接口,则将使用Swift中更常见的模式来访问它。您不必其定义为属性,但是通常可以。

  2. 请注意,我将此属性定义为sharedFoo,而不是sharedInstancesharedManager通过调用它sharedFoo,当您将此代码与Swift桥接时,它将自动显示为shared,作为约定,Swift用于其单例和其他共享实例的更简洁的名称。

  3. 在这种情况下,我已声明initnewunavailable这将防止开发人员意外实​​例化其他实例。同样,这是单例目的的问题。

如果您在整个Cocoa API中查看单例(或其他共享实例),您会发现Apple已过渡到这种属性方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章