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中的抽象 ...
随机推荐
- HTTP协议类
本文从以下几方面介绍HTTP协议 HTTP协议的主要特点 HTTP报文的组成部分 HTTP方法 HTTP状态码 POST和GET的区别 什么是持久连接 什么是管线化 主要特点: http协议的特点: ...
- Java 读取 .properties 配置文件的几种方式
Java 开发中,需要将一些易变的配置参数放置再 XML 配置文件或者 properties 配置文件中.然而 XML 配置文件需要通过 DOM 或 SAX 方式解析,而读取 properties 配 ...
- webpack中tree-shaking技术介绍
之前介绍过webpack3的新特性,里面提到webpack2支持了ES6的import和export,不需要将ES6的模块先转成CommonJS模块,然后再进行打包处理.正基于此,webpack2引入 ...
- web离线应用--applicationCache
applicationCache是html5新增的一个离线应用功能 离线浏览: 用户可以在离线状态下浏览网站内容. 更快的速度: 因为数据被存储在本地,所以速度会更快. 减轻服务器的负载: 浏览器只会 ...
- [对smartMenu.js改进] 解决右键菜单栏在边缘弹出后,移出视图区域无法操作的问题
当用户在视图边缘(如右下角)右键召唤菜单栏的时候,菜单仍然从选中元素的右下角弹出,这时二级菜单栏一般都离开了视图区域,用户无法进一步操作. 这个问题挺常见的,原作者的留言板: 但是作者应该是已经不再维 ...
- upload 上传类
<?php/**file: fileupload.class.php 文件上传类FileUpload本类的实例对象用于处理上传文件,可以上传一个文件,也可同时处理多个文件上传 */class U ...
- PHP核心技术
一.PHP核心技术 1.写出一个能创建多级目录的PHP函数(新浪网技术部) <?php /** * 创建多级目录 * @param $path string 要创建的目录 * @param $m ...
- hibernate log4j
log4j.rootLogger=warn, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender. ...
- 分享一个好用的微信npmjs包
https://www.npmjs.com/package/jquery_wechat_sdk 安装 $ npm install jquery_wechat_sdk 使用 Browser Script ...
- eclipse导入新项目后,运行时找不到主类解决办法
最近在学习多线程,今天下了一套源码,导入到eclipse里后,随便找了个带main()的类试了一下,找不到主类. 首先想到的解决办法是把工程clean一下,并没有用.去网上找了一个遍终于找到了管用的方 ...