THE RIGHT WAY TO WRITE A SINGLETON

A TRIP DOWN MEMORY LANE

@interface Kraken : NSObject
@end

@implementation Kraken

+ (instancetype)sharedInstance {
    static Kraken *sharedInstance = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        sharedInstance = [[Kraken alloc] init];
    });
    return sharedInstance;
}

@end

THE UGLIEST WAY (A.K.A. THE "WHY ARE YOU STILL CODING IN SWIFT IF YOU‘RE JUST GOING TO DO THIS" WAY)

class TheOneAndOnlyKraken {
    class var sharedInstance: TheOneAndOnlyKraken {
        struct Static {
            static var onceToken: dispatch_once_t = 0
            static var instance: TheOneAndOnlyKraken? = nil
        }
        dispatch_once(&Static.onceToken) {
            Static.instance = TheOneAndOnlyKraken()
        }
        return Static.instance!
    }
}

THE STRUCT WAY (A.K.A. THE "OLD BUT STRANGELY STILL POPULAR" WAY)

class TheOneAndOnlyKraken {
    class var sharedInstance: TheOneAndOnlyKraken {
        struct Static {
            static let instance = TheOneAndOnlyKraken()
        }
        return Static.instance
    }
}

THE GLOBAL VARIABLE WAY (A.K.A. THE "ONE LINE SINGLETON")

private let sharedKraken = TheOneAndOnlyKraken()
class TheOneAndOnlyKraken {
    class var sharedInstance: TheOneAndOnlyKraken {
        return sharedKraken
    }
}

THE RIGHT WAY A.K.A. "THE ONE LINE SINGLETON (NOW WITH PROOF!")

class TheOneAndOnlyKraken {
    static let sharedInstance = TheOneAndOnlyKraken()
}

DON‘T FORGET THE PRIVATE INIT!

class TheOneAndOnlyKraken {
    static let sharedInstance = TheOneAndOnlyKraken()
    private init() {} //This prevents others from using the default ‘()‘ initializer for this class.
}

FROM: http://krakendev.io/blog/the-right-way-to-write-a-singleton

时间: 2024-10-14 18:06:21

THE RIGHT WAY TO WRITE A SINGLETON的相关文章

说说设计模式~单件模式(Singleton)

单件模式(Singleton)要求一个类有且仅有一个实例,并且提供了一个全局的访问点. 从概念上来研究一下它的实现,不考虑线程安全 1 public sealed class Singlton 2 { 3 static Singlton instance = null; 4 private Singlton() { } 6 7 public static Singlton Instance 8 { 9 get 10 { 11 if (instance == null) 12 { 13 insta

.Net 单例模式(Singleton)

每台计算机可以有若干个打印机,但只能有一个Printer Spooler, 以避免两个打印作业同时输出到打印机中.每台计算机可以有若干传真卡,但是只应该有一个软件负责管理传真卡,以避免出现两份传真作业同时传到传真卡中的情况.每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用. 问题描述: 单例模式 Singleton Pattern 问题解决: (1)单例模式简介: Singleton模式要求一个类有且仅有一个实例,并且提供了一个全局的访问点.这

两种用于派生的Singleton模式(以TextureMgr为例)

Singleton,顾名思义,从字面上来理解就是单例模式,这是C++程序中 常用到的一种设计模式,特别是像文件管理器,纹理管理器这种整个软件 中只需要唯一的实例来管理所有资源时,这种模式的价值便得以体现. 下面来介绍两种用于派生管理的Singleton模式: 其中,第一种是Gof版本的Singleton, 其代码如下: //[Singleton_Gof.h] #pragma once template<typename T> class Singleton_Gof { protected: s

设计模式--singleton模式

使用单件模式的意图是保证一个类只有一个实例,并提供一个访问它的全局访问点. 将单件定义为全局或静态对象,然后依赖于自动的初始化,并不能完全实现上述意图.虽然可以提供全局访问点,但这是不够的.原因如下: 1)我们不能保证静态对象只有一个实例会被声明. 2)我们可能没有足够信息在静态初始化时实例化每个单件,单件可能需要在程序运行中稍后被计算出来的值. 3)c++没有定义转换单元上全局对象的构造器的调用顺序.这意味着单件之间不存在依赖关系:如果有,那么错误将是不可避免的. 4)使用全局或静态对象的实现

设计模式之五:单例模式(Singleton Pattern)

单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式有三个要点: 点某个类只能有一个实例: 它必须自行创建这个实例 它必须自行向整个系统提供这个实例. 一些资源管理器常常设计成单例模式. C#中的单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点 实现要点: 单例模式是限制而不是改进类的创建. 单例模式一般不要支持Icloneable接口,因为这可能导致多个对象实例,与单例模式的初衷违背. 单例模式一般

设计模式的征途—1.单例(Singleton)模式

单例模式属于创建型模式的一种,创建型模式是一类最常用的设计模式,在软件开发中应用非常广泛.创建型模式将对象的创建和使用分离,在使用对象时无需关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展.每一个创建型模式都在视图回答3个问题:3W -> 创建什么(What).由谁创建(Who)和何时创建(When). 本篇是创建型模式的第一篇,也是最简单的一个设计模式,虽然简单,但是其使用频率确是很高的. 单例模式(Singleton) 学习难度:★☆☆☆☆ 使用频率:★★★★☆ 一.单例

设计模式-单例模式(Singleton Pattren)

单例模式(Singleton Pattren):确保一个类只有一个实例,并提供一个全局访问点. 实现要点: 1. 私有化构造方法 2. 类的实例在类初始化的时候创建 3. 提供一个类方法,返回值为类的实例,其他类调用该方法获取到该类的实例 1. 常规实现(线程不安全): 1 public class Singleton1 { 2 private static Singleton1 instance; 3 4 private Singleton1() { 5 6 } 7 8 public stat

C++ CRTP singleton

C++ CRTP 是个很有意思的东西,因为解释原理的文章很多,但是讲怎么用的就不是很多了. 今天就稍微写下CRTP(奇异递归模板模式)的一个有趣的用法:Singleton(单例模式) 单例有很多中写法,最常见的就是直接写(笑),不过今天就不介绍直接写的写法了,下面是用模版的方式来写,不过有别于其他的模版实现方式,采用的是CRTP: 1 template<class ActualClass> 2 class Singleton 3 { 4 public: 5 static ActualClass

单例模式(Singleton)

单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销. 2.省去了new操作符,降低了系统内存的使用频率,减轻GC压力. 3.有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了.(比如一个军队出现了多个司令员同时指挥,肯定会乱成一团),所以只有使用单例模式,才能保证核心交易服务器独立控制整个流程. 单例

设计模式之Singleton(单例)

设计模式之Singleton(单态) 板桥里人 http://www.jdon.com 2002/05/07 定义:Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作. 还有, singleton能够被状态化; 这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,