首页 > 代码库 > IOS开发基础Object-C(12)—单例模式

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;
}



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