美文网首页
创建型模式-单例

创建型模式-单例

作者: 关灯侠 | 来源:发表于2017-03-15 00:15 被阅读26次

使用场景:只需要一个实例。例如现实世界的资源:服务器;或封装共享资源。

意义:

1、使得创建的实例始终保持一份,避免多次创建。
2、对象与现实资源对应。
3、封装共享资源。

创建Swift单例

1、使用全局常量

//全局变量
let globalLogger = Logger()

//final修饰后,防止子类创建
final class Logger{
    
    private var data = [String]()
    private let arrayQ = DispatchQueue.init(label: "arrayQ")
    //只在本文件有效,防止其他地方实例
    fileprivate init() { 
    }
    
    func log(msg:String){
        //同步添加数组
        arrayQ.sync {
            data.append(msg)
        }
    }
    
    func printLog(){
       for msg in data {
            print("Log:\(msg)")
        }
    }
}

2、使用结构体

final class BackupServer {
   //防止外界初始化
   fileprivate init(name:String) {
        self.name = name
        globalLogger.log(msg: "Created new server \(name)")
    }

    //BackupServer类型的属性server,初始化值是结构体的静态属性
    class var server:BackupServer{
        //结构体
        struct SingletonWrapper{
            //静态属性,用实例赋值
            static let singleton = BackupServer.init(name: "MainServer")
        }
        //返回结构体的属性值
        return SingletonWrapper.singleton
    }
}

使用注意:

1、Swift的单例模式只适用于引用类型,即类。结构体和其他值类型是不能用的,因为结构体本身具有复制功能。

2、处理并发。因为单例是共享资源,里面如果有数组、字典等集合,在读写操作的时候就需要考虑线程安全问题,避免出现多个线程同时写一个集合。Swift3的GCD需要适应一下。

  • 使用串行,如上使用全局变量创建单例中,使用到的
  func log(msg:String){
        //同步添加数组
        arrayQ.sync {
            data.append(msg)
        }
    }
  • 也可以串行写,并行读。用到了barrier,它的功能就是,barrier block到达队列顶端时,变成串行队列,所有操作都要等待它完成,完成后恢复并行队列,直到出现下一个barrier block
var arrayQ = DispatchQueue.init(label: "arrayQ")
func logItem(item:T) {
        //dispatch_barrier 最新写法
        //当barrier队列执行的时候,其他线程不能执行,就是串行队列
        //执行到其他队列的时候就是并行队列,直到运行到下一个barrier
        arrayQ.async(execute: DispatchWorkItem.init(qos: DispatchQoS.default, flags: DispatchWorkItemFlags.barrier, block: { 
            self.dataItems.append(item.copy() as! T)
            self.callback(item)
        }))
    }

demo

例子都在这里

写在后面:

我写的关于设计模式内容,都是来自书《精通Swift设计模式》,如果有兴趣可以直接买来看看,不用看我的"歪曲理解"。我只是一个搬运工,记录过程,记录一点浅显的理解🙏。

相关文章

  • 开发之设计模式-单例模式

    设计模式 设计模式分为三大类:创建型、结构型、行为型在Java中有24中设计模式 创建型:单例 1、为什么用单例模...

  • 2.架构设计(单例模式设计)

    1.设计模式分为三个类 创建型 结构型 行为型 2.创建型:单例模式 为什么用单例模式?如果你看到这个问题,你怎么...

  • 【设计模式】创建型设计模式汇总

    创建型设计模式汇总 1. 单例模式 1.1 单例模式的定义 一个类只允许创建一个对象或实例。 1.2 单例模式的作...

  • 单例模式

    单例 单例模式,是一种设计模式,属于创建型设计模式,还有一种创建型设计模式,工厂模式。设计模式总共有23种,三大类...

  • 23种设计模式学习总结

    创建型设计模式 主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码合使用代码。 单例模式 单例模式用来...

  • S4. 单例模式

    单例模式(Singleton) 介绍 单例模式是创建型设计模式,即用于创建对象的设计。其能够保证当前系统仅存在一个...

  • Python 之单例模式

    简介:单例模式(Singleton Pattern) 是最简单的设计模式之一,属于创建型的设计模式。单例模式涉及到...

  • iOS架构探究--单例模式

    设计模式分为三大类:创建型、结构性、行为型。单例模式就属于创建类。 1.为什么用单例模式? 由开发者的编程习惯...

  • “Python的单例模式有四种写法,你知道么?”——孔乙己

    什么是单例模式 单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型...

  • 设计模式分类

    经典23种设计模式: 创建型设计模式: Singleton Pattern(单例模式) PrototypePatt...

网友评论

      本文标题:创建型模式-单例

      本文链接:https://www.haomeiwen.com/subject/osnqnttx.html