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

时间:2018-03-19 17:00:51

标签: singleton

我有一个问题。

singleton类和singleton方法有什么区别。我创建了共享实例方法,如果我使用alloc方法,它会创建新实例吗? 提前致谢

1 个答案:

答案 0 :(得分:2)

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

“单例方法”指的是用于访问实例的方法。 (现在,在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. 在这种情况下,我已将initnew声明为unavailable。这将阻止开发人员意外地实例化其他实例。同样,这是单身人士的目的问题。

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