iOS 单利模式实现/优缺点

时间:2021-10-22 21:15:12

 

感谢此文章提供摘要: http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html

优缺点:  http://blog.csdn.net/tayanxunhua/article/details/8250329

单利模式的7中写法: http://cantellow.iteye.com/blog/838473

 

GCD 几句实现单利:

.m中的写这一步即可食用

static  XSYCoreDataStackManger * xsyCoreDataManager = nil;

+(XSYCoreDataStackManger *)shareInstance{
    
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        xsyCoreDataManager = [[XSYCoreDataStackManger alloc] init];
        
    });
    
    return xsyCoreDataManager;
    
}

 

 

1.单例模式的要点:

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

2.单例模式的优点:

  1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。
  2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程

3.单例模式的缺点

1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。

2、单例类的职责过重,在一定程度上违背了“单一职责原则”。

3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

 
 
iOS中的单例模式
  在objective-c中要实现一个单例类,至少需要做以下四个步骤:
  1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
  2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
  3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
  4、适当实现allocWitheZone,copyWithZone
 
下面以 CenterLiShi  (数据库) 为例子:
 
.h
 1 #import <Foundation/Foundation.h>
 2 #import "ModelHome.h"  //数据模型
 3 
 4 typedef enum {
 5     kRecordLISHI =1,//历史
 6     kRecordShouCang//收藏
 7 }recordType;
 8 @interface CenterLiShi : NSObject
 9 
10 +(CenterLiShi*)sharedDataCenter;
11 
12 //添加数据库
13 -(void)AddDataWithModel:(ModelHomeJing*)model andType:(recordType)type;
14 
15 //删除数据库
16 -(void)deleteDataWith:(ModelHomeJing*)model addType:(recordType)type;
17 
18 //判断是否已经包含在数据库中
19 -(BOOL)isHaddata:(ModelHomeJing*)model addtype:(recordType)type;
20 
21 //获取数据库
22 -(NSArray*)getDatashujulishi:(recordType)type;
23 
24 @end

.M

  1 #import "CenterLiShi.h"
  2 #import "FMDatabase.h"
  3 
  4 @interface CenterLiShi ()
  5 @property(nonatomic,strong)FMDatabase * database;
  6 
  7 
  8 @end
  9 
 10 @implementation CenterLiShi
 11 
 12 static CenterLiShi * centerlishi = nil; //静态实例,并且初始化
 13 
 14 +(CenterLiShi*)sharedDataCenter{//实例构造检查实力是否为nil
 15     
 16     @synchronized(self)
 17     
 18     {
 19         if (!centerlishi)
 20         
 21         {
 22             
 23             centerlishi = [[CenterLiShi alloc] init];
 24             
 25         }
 26     }
 27     
 28     return centerlishi;
 29     
 30 }
 31 
 32 +(id)allocWithZone:(struct _NSZone *)zone //重写allocWithZone方法
 33 
 34 {
 35     
 36     @synchronized(self)
 37     
 38     {
 39         if (!centerlishi)
 40         
 41         {
 42             centerlishi = [super allocWithZone:zone];
 43             
 44         }
 45     }
 46     
 47     return centerlishi;
 48     
 49 }
 50 
 51 -(id)init{  //内部写初始化方法 单利实现 
 52     if (self = [super init]) {
 53         NSString * sqlpath = [NSString stringWithFormat:@"%@/Documents/lishi.rdb",NSHomeDirectory()];
 54         
 55         _database = [[FMDatabase alloc] initWithPath:sqlpath];
 56         if (![_database open]) {
 57             NSLog(@"打开数据库失败");
 58             return nil ;
 59             
 60         }
 61         else{
 62             
 63             NSLog(@"打开数据库成功了");
 64             
 65         }
 66     
 67         
 68         NSString * sql = @"create table if not exists lishi ("
 69         "recordType varchar(32),"
 70         "jingxuanappId varchar(132),"
 71     "labMc varchar(132),"
 72     "imgDatu varchar(132),"
 73     "imgtouxiang varchar(132),"
 74     "labyonghu varchar(132),"
 75     "labjieshao varchar(132)"
 76         ")";
 77         
 78         BOOL iscuc = [_database executeUpdate:sql];
 79         
 80         if (iscuc)
 81         
 82         {
 83             NSLog(@"表格创建成功了");
 84             
 85         }else{
 86             
 87             NSLog(@"表格创建失败了");
 88             
 89         }
 90     }
 91     
 92     return self;
 93     
 94     
 95 }
 96 //
 97 -(void)AddDataWithModel:(ModelHomeJing *)model andType:(recordType)type
 98 
 99 {
100     
101     NSString * sql = @"INSERT INTO lishi(recordType,jingxuanappId,labMc,imgDatu,imgtouxiang,labyonghu,labjieshao) values(?,?,?,?,?,?,?)";
102     
103     BOOL iscus = [_database executeUpdate:sql,[NSString stringWithFormat:@"%d",type],model.jingxuanappId,model.labMc,model.imgDatu,model.imgtouxiang,model.labyonghu,model.labjieshao];
104     
105     if (iscus)
106     
107     {
108         NSLog(@"添加数据");
109     }
110     
111     else
112     
113     {
114         
115         NSLog(@"没有添加");
116         
117     }
118 }
119 
120 -(void)deleteDataWith:(ModelHomeJing *)model addType:(recordType)type
121 
122 {
123     
124     NSString * sql = @"delete from lishi where jingxuanappId=? and recordType=?";
125     
126     BOOL isd = [_database executeUpdate:sql,model.jingxuanappId,[NSString stringWithFormat:@"%i",type]];
127     
128     if (isd)
129     
130     {
131         NSLog(@"删除成功");
132         
133     }
134     
135     else
136     
137     {
138         
139         
140         NSLog(@"没有删除");
141         
142     }
143 }
144 
145 
146 -(NSArray *)getDatashujulishi:(recordType)type
147 
148 {
149     
150     NSString * sql = @"select * from lishi where recordType=?";
151     
152     FMResultSet * set = [_database executeQuery:sql,[NSString stringWithFormat:@"%i",type]];
153     
154     NSMutableArray * array = [NSMutableArray array];
155     
156     while ([set next])
157     
158     {
159         ModelHomeJing * mod =[ModelHomeJing modelWithSet:set];
160         
161         [array addObject:mod];
162     
163     }
164     
165     return array;
166     
167     
168 }
169 
170 -(BOOL)isHaddata:(ModelHomeJing *)model addtype:(recordType)type
171 
172 {
173     NSString * sql = @"select count(*) from lishi where jingxuanappId=? and recordType=?";
174     FMResultSet * set = [self.database executeQuery:sql,model.jingxuanappId,[NSString stringWithFormat:@"%i",type]];
175     
176     int count=0;
177     
178     if ([set next])
179     
180     {
181         count = [set intForColumnIndex:0];
182         
183     }
184     
185     return count;
186     
187     
188 }
189 @end