Object-C 学习笔记(六)---单例设计模式

原创 2013年12月02日 17:10:48

说到单例,在java学习07-单例设计模式已经说的很清楚,Object-C也是一门面向对象的语言,于是除了写法不同,其他都是大同小异.

---未来会出一套 "设计模式"学习的笔记奋斗


原则:

(1) 不能直接调用构造方法---私有

(2)对象内存只能初始化一次---static

(3)使用其他静态接口(方法)把静态的对象返回

废话少说了,让我们直接上程序吧.

//
//  People.h
//  Single
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface People : NSObject<NScopying>

//定义静态方法
+(People *)getInstance;

@end


//
//  People.m
//  Single
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "People.h"

@implementation People

static People *single = nil;

+(People *)getInstance
{
    @synchronized(self)//线程锁,可以不使用,使用之后使线程安全,但是执行速率下降
    {
        if (!single) {
            single = [[[self class] alloc]init];
        }
    }
    return single;
}

#pragma mark 下面方法确保只有一个实例

//当调用alloc
+(id)allocWithZone:(NSZone *)zone
{
    if (!single) {
        single = [super allocWithZone:zone];
    }
    
    return single;
}

//覆盖copy协议
-(id)copyWithZone:(NSZone *)zone
{
    return single;
}

-(id)retain
{
    return single;
}

-(oneway void)release
{
}

-(id)autorelease
{
    return single;
}

-(NSUInteger)retainCount
{
    return UINT_MAX;//返回一个>0的值
}

-(void)dealloc
{
    [super dealloc];
}

@end



//
//  main.m
//  Single
//  DRAGON
//  Created by 5016 on 13-12-2.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "People.h"

int main(int argc, const char * argv[])
{
    People* person1 = [People getInstance];
    People* person2 = [People getInstance];
    
    //判断是否为同一对象堆内存空间
    if (person1 == person2) {
        NSLog(@"true");//当然是打印true
    }else{
        NSLog(@"false");
    }
    return 0;
}

笔者认为单例不需要使用同步,静态区是一个独立的内存块,静态修饰的变量或方法随着类的加载而加载,只初始化一次,优先与对象的存在,就算启动多个线程,也不可能再初始化静态对象,使用同步会使系统内部增加判断,负载增加,程序执行降低效率….

但是,有时候同步是必要的,详细可以去看同步控制单例,http://www.ibm.com/developerworks/cn/java/l-singleton/


几种语言的单例模式的实现(C++/C#/Object-C)

几种语言的单例模式(C++/C#/Object-C)
  • skylin19840101
  • skylin19840101
  • 2017年02月07日 10:26
  • 305

设计模式——单例模式的几种实现方式

1.饿汉式:静态常量 这种方法非常的简单,因为单例的实例被声明成static和final变量了,在第一次加载类到内存中时就会初始化,所以会创建实例本身是线程安全的。public class Singl...
  • bingogirl
  • bingogirl
  • 2016年09月01日 00:03
  • 1171

设计模式学习笔记---单例模式(Java版)

GOF23(Group of  four) 创建型模式 单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式。 结构型模式 适配器模式,桥接模式,装饰模式,组合模式,外观模式,享元模式,代理模式...
  • scgaliguodong123_
  • scgaliguodong123_
  • 2015年01月09日 09:30
  • 1112

单例模式的6种实现方式

为什么使用单例模式需要确保某个类只要一个对象,或创建一个类需要消耗的资源过多,如访问IO和数据库操作等,这时就需要考虑使用单例模式了。使用单例模式需要注意的关键点 将构造函数访问修饰符设置为priva...
  • ts1900
  • ts1900
  • 2016年05月13日 16:03
  • 1545

设计模式:单例模式(Singleton)

单例模式在23个设计模式中算得上是最简单的一个了,也行你会有异议,那就换成“最简单之一”,这样就严谨了很多。   单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。   适用性:当类...
  • u013256816
  • u013256816
  • 2016年03月23日 21:37
  • 4744

java设计模式之单例模式(几种写法及比较)

概念:   java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。   单例模式有以下特点:   1、单例类只能有一个实例。  ...
  • tolcf
  • tolcf
  • 2015年10月21日 22:56
  • 6146

C++设计模式[二]单例模式

接着就是单例模式;个人理解就是把创建方法改为私有,然后再内部实例化,禁止外部创建对象。 何为单例模式,在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:保证一个类只有一个实例,并提供一个...
  • langb2014
  • langb2014
  • 2015年11月03日 16:11
  • 1003

设计模式(二)单例模式的七种写法

面试的时候,问到许多年轻的Android开发他所会的设计模式是什么,基本上都会提到单例模式,但是对单例模式也是一知半解,在Android开发中我们经常会运用单例模式,所以我们还是要更了解单例模式才对。...
  • itachi85
  • itachi85
  • 2016年01月17日 10:29
  • 23773

单例模式(Singleton)- 最易懂的设计模式解析

前言今天我来全面总结一下Android开发中最常用的设计模式 - 单例模式。 关于设计模式的介绍,可以看下我之前写的:1分钟全面了解“设计模式” 目录1. 引入1.1 解决的是什么问题之前说过,设...
  • carson_ho
  • carson_ho
  • 2016年08月16日 17:15
  • 3984

Java四种单例设计模式

Java中的四种单例模式单例模式是最容易理解的设计模式之一,介绍Java中单例模式的四种写法。1.饿汉式单例模式public class Singleton{ private static S...
  • twocold_2010
  • twocold_2010
  • 2016年11月20日 15:13
  • 176
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Object-C 学习笔记(六)---单例设计模式
举报原因:
原因补充:

(最多只允许输入30个字)