委托模式:为其他对象提供一种委托以控制对这个对象的访问。理解委托:比如说卖房子得问题,房东一般不直接去卖防止,而是通过中介间接卖,那么中介就是房东的委托,房东委托中介去卖房子。这就是委托模式。
委托与单例混合实现:
厂长和车间主任之间的工作例子。
厂长类:
//厂长类
#import <Foundation/Foundation.h>
#import "PProtocol.h"
@class FManager;
@interface FManager : NSObject
@property (retain,nonatomic)id<PProtocol>delegate;
@property (retain,nonatomic)NSString *name;
//生产的方法
- (void) production;
//单例方法
+(id)getInstance;
@end
#import "FManager.h"
//设置全局变量
static FManager *fm =nil;
@implementation FManager
- (void)production{
NSLog(@"车间主任完成生产任务!");
//判断是否遵循了协议
if ([self.delegateconformsToProtocol:@protocol(PProtocol) ]) {
//判断是否响应方法
if ([self.delegaterespondsToSelector:@selector(startProduce)]) {
[self.delegatestartProduce];
}
}
}
//实现工厂方法,返回单一对象
+ (id)getInstance{
//锁方法
@synchronized(self){
//如果对象等于nil则创建对象,如果不为空就返回当前对象
if (fm ==nil) {
fm = [[FManageralloc]init];
}
}
return fm;
}
//防止通过alloc、new方法创建新的实例 重写allocWithZone方法
+ (id)allocWithZone:(NSZone *)zone{
@synchronized(self){
if (fm ==nil) {
fm = [superallocWithZone:zone];
}
}
return fm;
}
//防止通过copy创建新的实例,重写copyWithZone方法
+ (id)copyWithZone:(NSZone *)zone{
return self;
}
//重写retainCount方法,防止dealloc,此方法中返回最大值
- (NSUInteger)retainCount{
returnNSUIntegerMax;
}
//重写retain方法 单例不释放 引用计数变化没有意义
- (id)retain{
return self;
}
//重写release方法 单例不释放 引用计数变化没有意义
- (oneway void)release{
}
//重写autorelease方法 单例不释放 引用计数变化没有意义
- (id)autorelease{
return self;
}
@end
车间主任类:
#import <Foundation/Foundation.h>
#import "PProtocol.h"
//设置车间主任要遵循的协议
@interface WManager : NSObject <PProtocol>
@end
#import "WManager.h"
@implementation WManager
//车间主任必须要实现的方法
- (void)startProduce{
NSLog(@"报告厂长已经超额完成任务!");
}
@end
#import <Foundation/Foundation.h>
@protocol PProtocol <NSObject>
//协议中得方法
- (void)startProduce;
@end
#import <Foundation/Foundation.h>
#import "FManager.h"//导入厂长类的头文件
#import "WManager.h"//导入车间主任的头文件
int main(int argc,constchar * argv[])
{
@autoreleasepool {
/*
1、定义厂长类,定义生产协议。声明遵守该协议的委托对象
2、在厂长类中定义生产方法
3、定义车间主任类,遵守厂长的生产协议方法
4、在主函数中实例化厂长和车间主任类,设置厂长类对象的delegate为车间主任类的对象
5、厂长类的单例实现
*/
//实例化wMangager车间主任类
//实例化fManager厂长类
WManager *wManager = [[WManageralloc]init];
FManager *fManeger = [[FManageralloc]init];
//厂长的委托就是车间主任的实例化对象
fManeger.delegate = wManager;
//调用厂长下生产命令的方法
[fManeger production];
//单例测试
/*
FManager *fm1 = [FManager getInstance];
fm1.name = @"小三";
NSLog(@"fm1=%p",fm1);
//fm1和fm2的地址是一样的
FManager *fm2 = [FManager getInstance];
fm2.name = @"小二";
NSLog(@"fm2=%p",fm2);
*/
//释放对象
[fManeger release];
[wManager release];
}
return 0;
}