感谢此文章提供摘要: 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. 使用Identity Server 4建立Authorization Server (6) - js(angular5) 客户端

    预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第二 ...

  2. mysql插入测试数据

    使用php生成sql文件,然后再倒入mysql. 1.编写php代码 <?php set_time_limit(0); ini_set("memory_limit", &qu ...

  3. Resin4安装配置

    #Resin4安装配置 # Resin4安装配置 #centos6 #参考http://467754239.blog.51cto.com/4878013/1558435 #yum -y install ...

  4. ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

  5. ubuntu指令记录

    记录一些指令,便于查看使用. 1.sudo -以其他身份运行命令,预设身份为root. 2.ctrl+alt+T打开终端(命令行窗口) 3.如何判断linux系统是32位还是64位,指令:getcon ...

  6. javascript设计模式——策略模式

    前面的话 在程序设计中,常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zip算法,也可以选择gzip算法.这些算法灵活多样,而且可以随意互相替换.这种解决方 ...

  7. Python-01 学习第一节

    python是一种解释型.面向对象.动态数据类型的高级程序设计语言. 执行Python程序: 对于大多数程序语言,第一个入门编程代码便是"Hello World!",以下代码为使用 ...

  8. 在学java继承中

    看到一片个人认为的好博客,http://www.cnblogs.com/dolphin0520/p/3803432.html   ;这一节看的比较慢,加油,就是干: 分类不好意思分到Java中,嘿嘿还 ...

  9. Java Random介绍

    一.简介 Random类位于java.util包下,此类的实例用于生成伪随机数流.之所以称之为伪随机,是因为真正意义上的随机数(或者称为随机事件)在某次产生过程中是按照实验过程表现的分布概率随机产生的 ...

  10. js作用域与执行环境(前端基础系列)

    一.作用域(what?) 官方解释是:"一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域." 单从文字理解比较难懂,举个栗子: ...