感谢此文章提供摘要: 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. mysql数据库相关知识

    什么是数据库?                数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库.(来自:百度) 什么是sql? 结构化查询语言(Struct ...

  2. AES高级加密标准简析

    1 AES高级加密标准简介 1.1 概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区 ...

  3. cocos2dx3.2移植android

    LOCAL_PATH := $(call my-dir)LOCAL_MYDIR = $(LOCAL_PATH)/../../Classesinclude $(CLEAR_VARS) $(call im ...

  4. 《java.util.concurrent 包源码阅读》08 CopyOnWriteArrayList和CopyOnWriteArraySet

    CopyOnWriteArrayList和CopyOnWriteArraySet从数据结构类型上来说是类似的,都是用数组实现的保存一组数据的数据结构,区别也简单就是List和set的区别.因此这里就先 ...

  5. TFboy养成记 tensor shape到底怎么说

    tensor.shape 对于一位向量,其形式为[x,] 对于矩阵,二维矩阵[x,y],三维矩阵[x,y,z] 对于标量,也就是0.3*x这种0.3,表示形式为() 如果说这个矩阵是三维的,你想获得其 ...

  6. JAVA基础2——类初始化相关执行顺序

    类初始化相关执行顺序 几个概念说明 代码块的含义与作用 static静态代码块: 一般用于初始化类中的静态变量.比如:给静态的数组或者list变量赋初值.使用static静态代码块进行初始化与直接在定 ...

  7. .Net Core 2.0 EntityFrameworkCore CodeFirst入门教程

    最近难得有时间闲下来,研究了一下.net core 2.0,总的来说,目前除了一些第三方的库不支持外,基本上可以满足我们的项目需求了! 我们就以一个网站开发为例,搭建一个简单的三层架构,先熟悉一下.n ...

  8. azure上连续部署web

    连续部署web   连续部署web,可以在第一次部署完web应用后,方便修改和自动提交代码部署新版本的web应用.其中自动提交使用github中的webhook,使代码在master上提交修改后可以自 ...

  9. 晓莲说-何不原创:java 实现二维数组冒泡排序

    新手从业路-为自己回顾知识的同时,也希望和大家分享经验: 话不多说,上代码 public class 冒泡排序 { /**     * @param admin     * @2017.12.4   ...

  10. Python之可变类型与不可变类型

    Python常见的数据类型有:数字 字符串 元组 列表 字典 不可变类型:数字 字符串 元组 可变类型: 列表 字典 a = 100 b = [100] def num1(x): x += x pri ...