IOS开发基础Object-C(12)—单例模式

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

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

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;
}
时间: 2025-01-10 09:13:56

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

iOS开发基础知识--碎片12

iOS开发基础知识--碎片12 1:Delegate运用 .h #import <UIKit/UIKit.h> @protocol FilterHeaderViewDelegate <NSObject> @required -(void)filterHeaderViewMoreBtnClicked:(id)sender; @end extern float CYLFilterHeaderViewHeigt; @interface FilterHeaderView : UIColle

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

1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可以存放,就是类NSNumber c:NSDATA与NSString互转 d:去除输入框空格(NSString也适用) f:IBOutlet,IBAction说明 2:IOS开发基础知识--碎片2  a:获得另一个控件器,并实现跳转 b:判断IOS版本 c:Button不同状态下背景图片 d:判断设备

iOS开发-基础面试题(一) 分类: 面试题

iOS开发-基础面试题(一) 1.Difference between shallow copy and deep copy??浅复制和深复制的区别?? 答:浅层复制:只复制指向对象的指针,而不复制引用对象本身.?深层复制:复制引用对象本身.?意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源?还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们

iOS开发基础知识--碎片32

 iOS开发基础知识--碎片32 1:动画属性UIViewAnimationOptions说明 a:常规动画属性设置(可以同时选择多个进行设置) UIViewAnimationOptionLayoutSubviews:动画过程中保证子视图跟随运动. UIViewAnimationOptionAllowUserInteraction:动画过程中允许用户交互. UIViewAnimationOptionBeginFromCurrentState:所有视图从当前状态开始运行. UIViewAnimat

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

对iOS开发基础-九宫格坐标(3)的代码进行进一步优化. 新建一个 UIView 的子类,并命名为 WJQAppView ,将 appxib.xib 中的 UIView 对象与新建的视图类进行关联.  WJQAppView 类中声明3个 IBOutlet 属性,与 appxib.xib 中的视图对象包含的 UIImageView . UILabel 和 UIButton 建立连接. WJQAppView 头文件代码如下所示: 1 //WJQAppView.h 2 @interface WJQAp

iOS开发基础-图片切换(2)

延续:iOS开发基础-图片切换(1),对(1)里面的代码进行改善. 在 ViewController 类中添加新的数组属性:  @property (nonatomic, strong) NSArray *infoArray; //存放图片信息 通过 self.infoArray 的 getter 方法对其实现初始化(懒加载),其中代码中的 _infoArray 不能用 self.infoArray 替换: 1 //infoArray的get方法 2 - (NSArray *)infoArray

iOS开发基础-图片切换(3)

延续:iOS开发基础-图片切换(2),对(2)里面的代码用属性列表plist进行改善. 新建 Property List 命名为 Data 获得一个后缀为 .plist 的文件. 按如图修改刚创建的文件: 最后,修改 infoArray 的 getter 方法: 1 //infoArray的getter方法 2 - (NSArray *)infoArray { 3 NSLog(@"需要获取图片信息数组"); 4 //只实例化一次 5 if (_infoArray == nil) { 6

iOS开发基础知识--碎片13

 iOS开发基础知识--碎片13 1:运行程序报the file couldn't be opened because you don't have permission to view it 解决办法:项目—>targets->build settings->build options->changed the value of the "Compiler for C/C++/Objective-C" to Default Compiler. 2:百度地图引用

iOS开发基础知识--碎片14

iOS开发基础知识--碎片14  1:ZIP文件压缩跟解压,使用ZipArchive 创建/添加一个zip包 ZipArchive* zipFile = [[ZipArchive alloc] init]; //次数得zipfilename需要一个完整得路径,例如***/Documents/demo.zip [zipFile CreateZipFile2:@"zipfilename"]; //有两种可选得方式进行创建压缩包,带密码和不带密码的 [[zipFile CreateZipFi