感谢此文章提供摘要: 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
 #import <Foundation/Foundation.h>
#import "ModelHome.h" //数据模型 typedef enum {
kRecordLISHI =,//历史
kRecordShouCang//收藏
}recordType;
@interface CenterLiShi : NSObject +(CenterLiShi*)sharedDataCenter; //添加数据库
-(void)AddDataWithModel:(ModelHomeJing*)model andType:(recordType)type; //删除数据库
-(void)deleteDataWith:(ModelHomeJing*)model addType:(recordType)type; //判断是否已经包含在数据库中
-(BOOL)isHaddata:(ModelHomeJing*)model addtype:(recordType)type; //获取数据库
-(NSArray*)getDatashujulishi:(recordType)type; @end

.M

 #import "CenterLiShi.h"
#import "FMDatabase.h" @interface CenterLiShi ()
@property(nonatomic,strong)FMDatabase * database; @end @implementation CenterLiShi static CenterLiShi * centerlishi = nil; //静态实例,并且初始化 +(CenterLiShi*)sharedDataCenter{//实例构造检查实力是否为nil @synchronized(self) {
if (!centerlishi) { centerlishi = [[CenterLiShi alloc] init]; }
} return centerlishi; } +(id)allocWithZone:(struct _NSZone *)zone //重写allocWithZone方法 { @synchronized(self) {
if (!centerlishi) {
centerlishi = [super allocWithZone:zone]; }
} return centerlishi; } -(id)init{ //内部写初始化方法 单利实现
if (self = [super init]) {
NSString * sqlpath = [NSString stringWithFormat:@"%@/Documents/lishi.rdb",NSHomeDirectory()]; _database = [[FMDatabase alloc] initWithPath:sqlpath];
if (![_database open]) {
NSLog(@"打开数据库失败");
return nil ; }
else{ NSLog(@"打开数据库成功了"); } NSString * sql = @"create table if not exists lishi ("
"recordType varchar(32),"
"jingxuanappId varchar(132),"
"labMc varchar(132),"
"imgDatu varchar(132),"
"imgtouxiang varchar(132),"
"labyonghu varchar(132),"
"labjieshao varchar(132)"
")"; BOOL iscuc = [_database executeUpdate:sql]; if (iscuc) {
NSLog(@"表格创建成功了"); }else{ NSLog(@"表格创建失败了"); }
} return self; }
//
-(void)AddDataWithModel:(ModelHomeJing *)model andType:(recordType)type { NSString * sql = @"INSERT INTO lishi(recordType,jingxuanappId,labMc,imgDatu,imgtouxiang,labyonghu,labjieshao) values(?,?,?,?,?,?,?)"; BOOL iscus = [_database executeUpdate:sql,[NSString stringWithFormat:@"%d",type],model.jingxuanappId,model.labMc,model.imgDatu,model.imgtouxiang,model.labyonghu,model.labjieshao]; if (iscus) {
NSLog(@"添加数据");
} else { NSLog(@"没有添加"); }
} -(void)deleteDataWith:(ModelHomeJing *)model addType:(recordType)type { NSString * sql = @"delete from lishi where jingxuanappId=? and recordType=?"; BOOL isd = [_database executeUpdate:sql,model.jingxuanappId,[NSString stringWithFormat:@"%i",type]]; if (isd) {
NSLog(@"删除成功"); } else { NSLog(@"没有删除"); }
} -(NSArray *)getDatashujulishi:(recordType)type { NSString * sql = @"select * from lishi where recordType=?"; FMResultSet * set = [_database executeQuery:sql,[NSString stringWithFormat:@"%i",type]]; NSMutableArray * array = [NSMutableArray array]; while ([set next]) {
ModelHomeJing * mod =[ModelHomeJing modelWithSet:set]; [array addObject:mod]; } return array; } -(BOOL)isHaddata:(ModelHomeJing *)model addtype:(recordType)type {
NSString * sql = @"select count(*) from lishi where jingxuanappId=? and recordType=?";
FMResultSet * set = [self.database executeQuery:sql,model.jingxuanappId,[NSString stringWithFormat:@"%i",type]]; int count=; if ([set next]) {
count = [set intForColumnIndex:]; } return count; }
@end
 

iOS 单利模式实现/优缺点的更多相关文章

  1. Node.js之单利模式

    在iOS中我们经常用到单利模式,这样就能够实现在多处共享同一数据,那么在Node.js中也存在这种模式. 我们知道,Node.js中模块的概念很重要,在写模块的接口的时候,只需要暴露出一个实例对象就能 ...

  2. Java 设计模式之单利模式

    一.首先介绍一下单例模式:     单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局 ...

  3. java 开发中经常问到得懒汉模式 (单利模式)

    //懒汉模式 class Single { public static Single s = null; public Single (){} public static Single getInst ...

  4. java 单利模式

    首先何为单利模式: 单利模式即多次调用同一个对象的时候,只有一个实例(这里所谓的实例就是,假如创建了两个对象,它们的hashCode相同) 下面是相关代码: 1 创建一个对象Singleton类 pa ...

  5. iOS 架构模式-MVVM

    iOS 架构模式-MVVM MVVM Model-View-ViewModelMVVM 其实是MVC的进化版,他将业务逻辑从VC中解耦到ViewModel,实现VC的瘦身. 做一个简单的登录判断: 创 ...

  6. static单利模式

    // //  main.m //  01-文件管理器 // //  Created by apple on 14-3-21. //  Copyright (c) 2014年 apple. All ri ...

  7. QF——iOS代理模式

    iOS的代理模式: A要完成某个功能,它可以自己完成,但有时出于一些原因,不方便自己完成.这时A可以委托B来帮其完成此功能,即由B代理完成.但是这个功能不是让B随随便便任其完成.此时,会有一个协议文件 ...

  8. java 设计模式之单利模式以及代理模式(静态)

    1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...

  9. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

随机推荐

  1. shell ping一个IP,延时大于5,输出延时大于5s,打印输出

    # ping一个IP,延时大于5,输出延时大于5s,打印输出 #!/bin/bash ip=$* echo $ip num=`ping  -c 10 ${ip}|grep icmp_seq|awk ' ...

  2. T-SQL的进阶:超越基本级别3:构建相关子查询——701小组

    T-SQL的进阶:超越基本级别3:构建相关子查询 格雷戈里·拉森,2014/03/05 原文链接: http://www.sqlservercentral.com/articles/Stairway+ ...

  3. [NOIP]玩具装箱

    题目:(非常经典的模拟赛题,适合动规入门的OIer) 简要分析:   动态规划,用一维数组 f[i] 表示从位置1 到 位置i 的最优花费 ,由于 f[i ] 以前的最优花费都是确定的,故只需要在 1 ...

  4. .meta和模型贴图丢失

    一些策划的工程里经常出现模型贴图丢失,同样的工程,其他人没有问题.就算全部还原,也无法解决,最后只要美术在它的工程里重新关联贴图.一次偶然的机会,我发现把模型和贴图的.meta文件删除,让unity重 ...

  5. Dashboard集群

    #Dashboard集群 openstack pike 部署 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##.Dashboard集群 #####在 ...

  6. CCF-201403-1-相反数

    问题描述 试题编号: 201403-1 试题名称: 相反数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 有 N 个非零且各不相同的整数.请你编一个程序求出它们中有多少对相反 ...

  7. 深入研究-webkit-overflow-scrolling:touch及ios滚动

    1. -webkit-overflow-scrolling:touch是什么? MDN上是这样定义的: -webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效 ...

  8. jvm内存回收诡异现象

    在知乎上看到一篇提问,于是做了个实验帮助他解答,这里整理成一篇文章分享一下. 先看代码如下代码: /** * Created on 2017/12/16. * * -verbose:gc -XX:+U ...

  9. Redis的五种数据类型及方法

    字符串string: 字符串类型是Redis中最为基础的数据存储类型,是一个由字节组成的序列,他在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据货Json对象描 ...

  10. UPDATE/INSERT用法研究

    UPDATE和INSERT语法相信大家都很熟悉,UPDATE的基本语法结构是 : UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 INSERT的基本语法是: INSERT ...