单例模式与原型模式

前言

建立型模式(Creational Patterns)提供了一种在建立对象的同时隐藏建立逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例须要建立哪些对象时更加灵活。建立型模式有多种,本文将简单介绍其中的单例模式(Singleton Pattern)与原型模式(Prototype Pattern),这两种设计模式都是处理对象建立的设计模式。数据库

单例模式 Singleton Pattern

单例模式能够说是最经常使用的设计模式之一。单例模式涉及到一个单一的类,该类负责建立本身的对象,同时确保只建立这个类的一个实例。这个类提供了一种访问其惟一的对象的方式,能够直接访问,不须要外部实例化该类的对象。 简单来讲,单例模式具备如下 3 个特色:编程

  1. 单例类只能有一个实例。
  2. 单例类必须可以自我实例化。
  3. 单例类必须给全部其余对象提供一个全局访问点。

应用

单例模式是编程中应用比较多的一种设计模式。比较常见的应用场景有:设计模式

  1. 有状态的工具类对象,各类存储config类
  2. 建立对象耗时过多或耗资源过多的对象,好比频繁访问数据库或文件的对象
  3. 系统只须要一个实例对象,负责统筹全局的对象等等

单例模式在多线程的应用场合下必须当心使用。若是当惟一实例还没有建立时,有两个线程同时调用建立方法,那么它们同时没有检测到惟一实例的存在,从而同时各自建立了一个实例, 这样就有两个实例被构造出来,从而违反了单例模式中实例惟一的原则,所以在使用时须要保证其线程安全。此外,因为单例模式使得对象是能够全局访问和修改的,在实现该类时对于其中的一些变量也应当保证线程读写安全。缓存

+ (instancetype)sharedInstance {
    static id sharedInstance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
}
复制代码

优缺点

优势:安全

  1. 在内存里只有一个实例,减小了内存的开销,尤为是频繁的建立和销毁实例
  2. 避免对资源的多重占用
  3. 能够全局访问

缺点:bash

  1. 没有接口,不能继承,难以拓展
  2. 单例类的职责太重,必定程度上违背了单一职责原则
  3. 因为是全局变量,在一个地方更改可能会影响其余区域

原型模式 Prototype Pattern

所谓原型模式就是用原型实例指定建立对象的种类,而且经过复制这些原型建立新的对象。原型模式能够说是全部设计模式中最简单的一种,其核心就是实现一个原型接口,该接口用于建立当前对象的克隆。当直接建立对象的代价比较大时,则采用这种模式。例如,一个对象须要在一个高代价的数据库操做以后被建立。咱们能够缓存该对象,在下一个请求时返回它的克隆,在须要的时候更新数据库,以此来减小数据库调用。多线程

应用

原型模式的实现主要涉及 3 个角色

  1. Client:提出建立对象的请求
  2. Prototype:这是一个抽象角色,定义了具体原型类所需实现的方法。
  3. Concrete Prototype:此角色须要实现 Prototype 要求的克隆接口。

原型模式十分简单,只须要实现 clone 接口便可。但 clone 时须要注意深拷贝和浅拷贝的区别。工具

浅拷贝:使用一个已知实例对新建立实例的成员变量逐个赋值,这个方式被称为浅拷贝。性能

深拷贝:当一个类的拷贝构造方法,不只要复制对象的全部非引用成员变量值,还要为引用类型的成员变量建立新的实例,而且初始化为形式参数实例值。ui

简单来讲,对于对象 A 引用对象 B,对 A 进行浅拷贝得到的是对象 A1 引用对象 B,对 A 进行深拷贝得到的是对象 A1 引用对象 B1。

优缺点

优势:

  1. 使用原型模式建立对象比直接new一个对象在性能上要好的多,由于Object类的clone方法是一个本地方法,它直接操做内存中的二进制流,特别是复制大对象时,性能的差异很是明显。
  2. 使用原型模式的另外一个好处是简化对象的建立,使得建立对象就像咱们在编辑文档时的复制粘贴同样简单。

缺点:

  1. 必须实现克隆接口
  2. 配备克隆方法须要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不必定很容易,特别当一个类引用含有循环结构的时候

单例模式与原型模式的对比

原型模式是在已指定对象的基础上,而后经过拷贝这些原型对象建立新的对象。而单例模式模式的核心是将类的构造方法私有化,以后在类的内部产生实例化对象,并经过静态方法返回实例化对象的应用。

相关文章
相关标签/搜索