iOS 单利模式实现/优缺点
感谢此文章提供摘要: 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.单例模式的优点:
3.单例模式的缺点
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。
1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
4、适当实现allocWitheZone,copyWithZone
#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 单利模式实现/优缺点的更多相关文章
- Node.js之单利模式
在iOS中我们经常用到单利模式,这样就能够实现在多处共享同一数据,那么在Node.js中也存在这种模式. 我们知道,Node.js中模块的概念很重要,在写模块的接口的时候,只需要暴露出一个实例对象就能 ...
- Java 设计模式之单利模式
一.首先介绍一下单例模式: 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局 ...
- java 开发中经常问到得懒汉模式 (单利模式)
//懒汉模式 class Single { public static Single s = null; public Single (){} public static Single getInst ...
- java 单利模式
首先何为单利模式: 单利模式即多次调用同一个对象的时候,只有一个实例(这里所谓的实例就是,假如创建了两个对象,它们的hashCode相同) 下面是相关代码: 1 创建一个对象Singleton类 pa ...
- iOS 架构模式-MVVM
iOS 架构模式-MVVM MVVM Model-View-ViewModelMVVM 其实是MVC的进化版,他将业务逻辑从VC中解耦到ViewModel,实现VC的瘦身. 做一个简单的登录判断: 创 ...
- static单利模式
// // main.m // 01-文件管理器 // // Created by apple on 14-3-21. // Copyright (c) 2014年 apple. All ri ...
- QF——iOS代理模式
iOS的代理模式: A要完成某个功能,它可以自己完成,但有时出于一些原因,不方便自己完成.这时A可以委托B来帮其完成此功能,即由B代理完成.但是这个功能不是让B随随便便任其完成.此时,会有一个协议文件 ...
- java 设计模式之单利模式以及代理模式(静态)
1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
随机推荐
- CentOS下安装Tomcat 8
CentOS下安装Tomcat 8 安装Tomcat8 去http://tomcat.apache.org/download-80.cgi下载Tomcat8的安装文件apache-tomcat-8.0 ...
- No bean named 'sqlSessionFactory' is defined
其实程序给出这个错误已经很明确了,说你的sqlSessionFactory是未定义的. 首先你要查看一下自己的web.xml文件是否配置了application*.xml <!--设置sprin ...
- 照虎画猫写自己的Spring——依赖注入
前言 上篇<照虎画猫写自己的Spring>从无到有讲述并实现了下面几点 声明配置文件,用于声明需要加载使用的类 加载配置文件,读取配置文件 解析配置文件,需要将配置文件中声明的标签转换为F ...
- Heap Sorting 总结 (C++)
各位读者,大家好. 因为算法和数据结构相关的知识都是在国外学的,所以有些词汇翻译的可能不准确,然后一些源代码的注释可能是英文的,如有给大家带来什么不方便,请见谅.今天我想写一下Heap相关的知识,从基 ...
- C++ 指针和引用 吐血整理 Pointer&Reference
说道C++的指针,很多人都很头疼,也很confuse.经常把它和变量名,引用(reference)等混淆,其实这最主要的原因是很多程序员对于基本知识的掌握有问题,从而导致的很多基本概念的混淆.本文就是 ...
- 记一下flex弹性布局
flex弹性布局也越来越广泛的在我们代码中出现了,更加方便我们的布局.自己用了查,查了用,有些还是记不住,俗话说好脑子不如烂笔头,原来都是写在本子上的,很不幸的一次次的想翻的时候总是找不到,还是写博客 ...
- zzuli 2131 Can Win dinic+链式前向星(难点:抽象出网络模型+建边)
2131: Can Win Time Limit: 1 Sec Memory Limit: 128 MB Submit: 431 Solved: 50 SubmitStatusWeb Board ...
- Linux中nginx手动安装
本分类下有一个环境一键安装.那这背后发生了什么呢?咱们手动使用源码进行安装. 1.首先保证有一个能联网的centos. 2.百度 ningx 官网 点download http://nginx. ...
- react-native从开始趟的坑
好多天没更了..... 之前用的华为手机老人机真机调试的,最近几天换了小米,又遇上了坑... 跟之前所有手机一样打开开发者模式,开发者模式是(关于手机--版本号---一直点啊点--退出---辅助功能里 ...
- 如何配置 Health Check?- 每天5分钟玩转 Docker 容器技术(107)
容器状态是 UP 的,应用就是健康的吗? 还真不一定!Docker 只能从容器启动进程的返回代码判断其状态,而对于容器内部应用的运行情况基本没有了解. 执行 docker run 命令时,通常会根据 ...