原文:http://www.jianshu.com/p/bf431fff235e

我们经常在编程中使用各种设计模式,在iOS中比较常见的设计模式有:单例模式、委托模式、观察者模式,当然实际上在Cocoa和Cocoa Touch框架中不仅仅是设计到这些设计模式,还有很多设计模式以及常规设计模式的变种等等。那什么是设计模式呢?

在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。这个术语是由埃里希·伽玛(Erich Gamma)等人在1990年代从建筑设计领域引入到计算机科学的。(引自维基百科)

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。(引自百度百科)

通过解释我们可以基本了解设计模式是什么这个问题,当然我们不在这里深入探讨设计模式概念理论方面的问题,而是对我们在iOS开发中常用到的几种设计模式进行梳理,以方便日常开发。

Tips:设计模式和架构模式通常容易混淆

  1. 不同点 设计模式是解决某类常见问题的方法思路总结(尺度小) 框架模式是从软件开发总体结构上提出的一中框架结构(尺度大)
  2. 共同点 降低耦合度、调高可拓展性、易维护

比如:MVC是架构模式,单例是设计模式

1. 单例模式(Singleton)

什么是单例

在程序的整个生命周期内,保证类只有一个实例对象并可在全局调用。

如何实现单例

实现单例我们需要注意两点:1.我们需要保证单例被实例化一次之后,不能被重复实例化2.在多线程模式下避免同时被一个以上的线程调用实例化方法而造成多个实例。

实现单例:

@synchronized同步锁

static SingletonInstant *_single = nil;

@implementation SingletonInstant

+ (instancetype)sharedInstant {
if (!_single) { // 判断放在加锁之前防止多次加锁
@synchronized(self) { // 添加同步锁防止保证线程安全
_single = [[super allocWithZone:NULL] init];
}
}
return _single;
}
// 上面使用allocWithZone不使用alloc是因为alloc方法会调用
// allocWithZone方法,如果使用alloc还要在重载的allocWithZone中
// 在实现一次判断和加锁,因此为了简化代码,
// 直接使用allocWithZone,在重载的方法中只要调用一次单例方法就可以了
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
return [self sharedInstant];
}
// copy方法也会调用copyWithZone方法,因此直接返回self就好
- (id)copyWithZone:(NSZone *)zone {
return self;
} @end #pragma - mark MRC实现
static SingletonInstant *_single = nil; + (SingletonInstant*)sharedManager
{
if (_single == nil) {
@synchronized (self) {
_single = [[super allocWithZone:NULL] init];
}
}
return _single;
} + (id)allocWithZone:(NSZone *)zone
{
return [[self sharedManager] retain];
} - (id)copyWithZone:(NSZone *)zone
{
return self;
}
// 比ARC多出来的关于内存管理的几个方法
- (id)retain
{
return self;
} - (NSUInteger)retainCount
{
return NSUIntegerMax; //denotes an object that cannot be released
} - (void)release
{
//do nothing
} - (id)autorelease
{
return self;
}

更多关于alloc和allocWithZone的问题请查阅参考4,MRC实现查阅参考3

GCD加锁

使用 dispatch_once_t 保证线程安全

static SingletonInstant *_single = nil;

@implementation SingletonInstant

+ (instancetype)sharedInstant {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!_single) {
_single = [[super allocWithZone:NULL] init];
}
});
return _single;
} + (instancetype)allocWithZone:(struct _NSZone *)zone {
return [self sharedInstant];
} - (id)copyWithZone:(NSZone *)zone {
return self;
} @end

在dispatch_once方法中的代码在程序的真个声明周期只会执行一次。,关于GCD请自行学习。

MRC不再详述

单例的实现基本雷同,在网上也有一些大同小异的其他写法,只要掌握单例思想,任何一种实现都是可以的,差异在细节上,孰优孰劣任君斟酌。

iOS Common Design Patterns:常用设计模式的更多相关文章

  1. Streamline Your App with Design Patterns 用设计模式精简你的应用程序

    Back to Design Patterns Streamline Your App with Design Patterns 用设计模式精简你的应用程序 In Objective-C progra ...

  2. 【design patterns】设计模式

    1.单例设计模式(singleton) 用途举例:对于多个程序使用同一个配置信息对象时比如在连接数据库时使用单例模式,每次只取出一个连接 步骤:①私有化该类的构造函数 ②私有化一个静态的对象 ③公有化 ...

  3. Head First Design Patterns HeadFirst 设计模式

    OO原则是我们的目标,而设计模式是我们的做法. 策略模式 (Strategy) 在软件开发上,一直不变的真理是"change".不管软件设计的多好,一段时间之后,总是要成长与改变, ...

  4. Java设计模式(Design Patterns)——可复用面向对象软件的基础

    设计模式(Design Patterns) 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 使用设计模式是为了可重用代码.让代码更容易被他 ...

  5. Apex Design Patterns

    Apex allows you to build just about any custom solution on the Force.com platform. But what are the ...

  6. TypeScript Version 23 Design Patterns

    TypeScript Version 23 Design Patterns TypeScript 设计模式 https://refactoring.guru/design-patterns/types ...

  7. Start Developing Mac Apps -- Design Patterns 设计模式

    Design Patterns A design pattern solves a common software engineering problem. Patterns are abstract ...

  8. Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】

    原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...

  9. 设计模式(Design Patterns)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

随机推荐

  1. Win10-IIS注册asp 此操作系统版本不支持此选项 错误解决方法

    现象再现: 今日在Win10上面ASP.NET网站突然不能跑了, 过程再现: 根据资料提示重新注册ASPNET_IIS.exe -i 直接提示: C:\WINDOWS\system32>c:\w ...

  2. casperJs的安装

    自己买了vps就是爽,想装什么就装什么.就比如说casperjs 1.首先需要安装它的运行环境phantomjs *将这个git项目clone到自己的vps上[https://github.com/a ...

  3. layui数据表格固定头部和第一列、colspan合并列

    刚看到原型图的时候,纳尼?不是跟我开玩笑吧,小女子资历尚浅,还真没做过像这样的功能,然后就是各种找度娘,可是都没有找到合适的,很多都是行合并,真的是头疼呀!再纠结是用VUE实现还是用layui实现好, ...

  4. 入门chrome插件开发教程和经验总结,一篇就搞掂!

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_44244857/articl ...

  5. C/C++ 传递信息给Java

    #开始 今天有人问我C++怎么给Java传递消息 大概需求是 用C++写了一个窗口 需要把编辑框里面的东西传递给Java做处理 #解决过程 我现在能想到的有三个简单的方法 1. Socket编程 通过 ...

  6. java内存模型中工作内存并不一定会同步主内存的情况分析

    其实是为了填之前的一个坑  在一个多线程的案例中出现了阻塞的情况. https://www.cnblogs.com/hetutu-5238/p/10477875.html   其中的第二个问题,即多个 ...

  7. java 实现一段文字中,出现次数最多的字

    代码如下: public static void main(String[] args) { String str = "大批量,之前都没怎么注意过,这个问题确实不会,网上参考了下别人的,大 ...

  8. 【PAT甲级】1079 Total Sales of Supply Chain (25 分)

    题意: 输入一个正整数N(<=1e5),表示共有N个结点,接着输入两个浮点数分别表示商品的进货价和每经过一层会增加的价格百分比.接着输入N行每行包括一个非负整数X,如果X为0则表明该结点为叶子结 ...

  9. C# FormData 文件太大报错404 Form表单上传大文件,无法进入后台Action,页面提示404.

    web.config中添加如下节点 <system.webServer> <security>      <requestFiltering >        &l ...

  10. Uva 11300 Spreading the Wealth(贪心)

    题目链接:https://vjudge.net/problem/UVA-11300 这道题的思路太神了,但很难想到是贪心. 用M表示每个人最终拥有的金币数. 首先假设有四个人.假设1号给2号3枚,2号 ...