单例模式的意思就是仅仅有一个实例。

单例模式确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例。这个类称为单例类。

1.单例模式的要点:

  显然单例模式的要点有三个;一是某个类仅仅能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

2.单例模式的长处:

  1.实例控制:Singleton 会阻止其它对象实例化其自己的 Singleton 对象的副本,从而确保全部对象都訪问唯一实例。

  2.灵活性:由于类控制了实例化过程,所以类能够更加灵活改动实例化过程
 

我们来举一个样例吧

比方说。我们须要有一个银行,能够在银行中存钱和取钱。银行的总钱数会随着存钱取钱而变化

我们来新建一个类 银行类

//
// Bank.h
// 08-Bank
//
// Created by cuixuerui on 15/12/29.
// Copyright (c) 2015年 cuixuerui. All rights reserved.
// #import <Foundation/Foundation.h> @interface Bank : NSObject @property int money; -(instancetype)initWithMoney:(int)money; +(Bank *)defaualtBank;
@end

实现算法 Bank.m

//
// Bank.m
// 08-Bank
//
// Created by cuixuerui on 15/12/29.
// Copyright (c) 2015年 cuixuerui. All rights reserved.
// #import "Bank.h" @implementation Bank -(instancetype)initWithMoney:(int)money { if (self =[super init]) {
_money=money;
}
return self;
} +(Bank *)defaualtBank { static Bank *bank;//全局变量
if (!bank) {//这句确保仅仅有一个实例
bank = [[Bank alloc]initWithMoney:1000];//自行创建实例
}
return bank; }
@end

事实上最重要的就是

+(Bank *)defaualtBank;

这是单例模式的关键所在

以下我们就来新建一个Person类

//  PersonOne.h
// 08-Bank
//
// Created by cuixuerui on 15/12/29.
// Copyright (c) 2015年 cuixuerui. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Bank.h" @interface PersonOne : NSObject{ Bank * _bank;
} -(void)withDrawMoney:(int)money;
-(void)saveMoney:(int)money; //-(instancetype)init;
@end

实现person类

//
// PersonOne.m
// 08-Bank
//
// Created by cuixuerui on 15/12/29.
// Copyright (c) 2015年 cuixuerui. All rights reserved.
// #import "PersonOne.h"
#import "Bank.h"
@implementation PersonOne -(instancetype)init{ if (self = [super init]) {
_bank = [Bank defaualtBank];
}
return self;
} -(void)saveMoney:(int)money { //一定要用创建单例对象的方法去创建 [_bank setMoney:[_bank money]+money]; NSLog(@"银行里还有%d",[_bank money]); } -(void)withDrawMoney:(int)money { [_bank setMoney:[_bank money]-money]; NSLog(@"银行里还有%d",[_bank money]); }
@end

最后在main方法中调用

//
// main.m
// 08-Bank
//
// Created by cuixuerui on 15/12/29.
// Copyright (c) 2015年 cuixuerui. All rights reserved.
// #import <Foundation/Foundation.h> #import "PersonOne.h"
int main(int argc, const char * argv[]) { PersonOne *p1 = [[PersonOne alloc] init]; [p1 saveMoney:500]; return 0;
}

IOS开发基础Object-C(12)—单例模式的更多相关文章

  1. IOS开发基础知识--碎片12

    1:Delegate运用 .h #import <UIKit/UIKit.h> @protocol FilterHeaderViewDelegate <NSObject> @r ...

  2. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  3. iOS开发基础-九宫格坐标(2)之模型

    在iOS开发基础-九宫格(1)中,属性变量 apps 是从plist文件中加载数据的,在 viewDidLoad 方法中的第20行.26行中,直接通过字典的键名来获取相应的信息,使得 ViewCont ...

  4. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  5. iOS开发——总结篇&IOS开发基础知识

    IOS开发基础知识 1:Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id) 对象在运行时获取其类型的能力称为内省.内省可以有多种方法实现. 判断 ...

  6. IOS开发基础环境搭建

    一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包:       ...

  7. iOS开发基础-九宫格坐标(6)

    继续对iOS开发基础-九宫格坐标(5)中的代码进行优化. 优化思路:把字典转模型部分的数据处理操作也拿到模型类中去实现,即将 ViewController 类实现中 apps 方法搬到 WJQAppI ...

  8. iOS开发基础-九宫格坐标(5)

    继续在iOS开发基础-九宫格坐标(4)的基础上进行优化. 一.改进思路 1)iOS开发基础-九宫格坐标(4)中 viewDidLoad 方法中的第21.22行对控件属性的设置能否拿到视图类 WJQAp ...

  9. iOS开发基础-九宫格坐标(4)

    对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联. ...

随机推荐

  1. BZOJ5217: [Lydsy2017省队十连测]航海舰队 FFT

    被FFT的空间卡了半天 后来发现根本不用开那么大... 首先可以把包含舰艇的那个小矩形找出来 将它一行一行连接成一个串T 其中舰艇位置为1其他位置为0 将大矩形也连成串S 其中礁石为1其他为0 两个串 ...

  2. 洛谷P2746 USACO5.1 校园网

    题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...

  3. Codeforces Round #351 (VK Cup 2016 Round 3, Div. 2 Edition) C. Bear and Colors 暴力

    C. Bear and Colors 题目连接: http://www.codeforces.com/contest/673/problem/C Description Bear Limak has ...

  4. redis缓存穿透解决办法--排它锁

  5. Duplicate Elimination in Scrapy(转)

    之前介绍 Scrapy 的时候提过 Spider Trap ,实际上,就算是正常的网络拓扑,也是很复杂的相互链接,虽然我当时给的那个例子对于我感兴趣的内容是可以有一个线性顺序依次爬下来的,但是这样的情 ...

  6. HDU 3726 Graph and Queries (离线处理+splay tree)

    Graph and Queries Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  7. 埃及分解:将2/n分解成为1/x+1/y的格式

    算法 古埃及以前创造出灿烂的人类文明,他们的分数表示却非常令人不解.古埃及喜欢把一个分数分解为类似: 1/a + 1/b 的格式. 这里,a 和 b 必须是不同的两个整数,分子必须为 1 比方,2/1 ...

  8. TCP Socket的一些行为

    几个重要的结论: 1. read总是在接收缓冲区有数据时立即返回,而不是等到给定的read buffer填满时返回. 只有当receive buffer为空时,blocking模式才会等待,而nonb ...

  9. JEECG第二期深入使用培训(报名截止2014-06-21)

    JEECG第二期深入使用培训(报名截止2014-06-21) JEECG深度研究-交流碰撞火花,你学会的不不过JEECG,很多其它的是软件架构思想 http://www.jeecg.org/forum ...

  10. C#中汉字排序简单示例(拼音/笔划)

    可以按照区域语言修改排序规则. class Program { static void Main(string[] args) { string[] arr = { "趙(ZHAO)&quo ...