【OC学习-29】单例设计模式的理解、案例和简单总结

单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例。为什么?有什么好处?

简单来说:

a:有的东西只能有一个,那就必须用单例;

b:单例的好处就是不会有多余的实例,所以节约内存;

c:因为只有一个单例,所以易于管理多线程对它的访问。

d:其他的原因……省略

我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy、retain这些,再看看它们是否是同一个实例,还是被创建出多个实例?

(1)User.h

#import <Foundation/Foundation.h>

@interface User : NSObject<NSCopying> //拷贝协议表明该对象可被拷贝,尽管都是同一个(因为是单例)
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *email;
//一般用share或者default做前缀,易于阅读标记为单例共享方法
+(id)shareUser;
@end

(2)User.m

#import "User.h"
static User *user1=nil; //先定义一个空得静态实例
@implementation User
+(id)shareUser{
    @synchronized(self){ //线程锁,防止多线程访问冲突
       if (user1==nil) { //判断这个实例是否为空,即是否已被创建
        user1=[[[self class ]alloc]init];//如果没被创建,就初始化一个
       }
    }
    return user1; //如果已存在,则不创建,直接返回即可
}

//以下都是防止实例不是唯一的一些方法,是通用格式,不必死记硬背,可以直接拷贝到任何单例模式中
//这是在调用alloc时可防止重复创建实例
+(id)allocWithZone:(NSZone *)zone{
    if (user1==nil) {
        user1=[super allocWithZone:zone];
    }
    return user1;
}
//这是在拷贝对象时防止重复创建
-(id)copyWithZone:(NSZone *)zone{
    return user1;
}
//这是在retain对象时防止重复创建,当然在ARC开启时可省略这个
-(id)retain{
    return user1;
}
//在release时什么都不做,因为一共就一个实例,不重复引用,所以不能release
-(oneway void)release{

}
//在autorelease时,返回实例,在ARC下客省略
-(void)autorelease{
    return user1;
}
//返回的时无符号整型,即大于0的数字,在ARC下可省略
-(NSUInteger)retainCount{
    return UINT_MAX;
}
@end

(3)main.m

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

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        User *user1=[User shareUser];
        User *user2=[User shareUser];
        User *user3=[[User alloc]init];
        User *user4=[user1 copy];
        NSLog(@"%@,%@,%@,%@",user1,user2,user3,user4);
    }
    return 0;
}

(4)上面四个对象是否是同一个,看地址可知,是同一个,即事单例

<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>,<User: 0x100106e70>

总结:

a:单例设计模式用得比较多

b:不仅在OC中又,JAVA等其他语言中也有,单例设计模式其实是一种编程思想,而不仅仅是某种语言特有的

时间: 2024-07-30 10:15:01

【OC学习-29】单例设计模式的理解、案例和简单总结的相关文章

OC学习-单例设计模式的理解、案例和简单总结

单例模式,就是一个类始终只有一个实例,不管如果copy还是retain还是alloc等等,都只有一个实例.为什么?有什么好处? 简单来说: a:有的东西只能有一个,那就必须用单例: b:单例的好处就是不会有多余的实例,所以节约内存: c:因为只有一个单例,所以易于管理多线程对它的访问. d:其他的原因……省略 我们创建一个单例的User类,然后生成一个user1对象,再把这个对象进行copy.retain这些,再看看它们是否是同一个实例,还是被创建出多个实例? (1)User.h view so

OC中的单例设计模式及单例的宏抽取

1 // 在一个对象需要重复使用,并且很频繁时,可以对对象使用单例设计模式 2 // 单例的设计其实就是多alloc内部的allocWithZone下手,重写该方法 3 4 #pragma Person.h文件 5 6 #import <Foundation/Foundation.h> 7 @interface Person : NSObject <NSCopying,NSMutableCopying> 8 + (instancetype)sharePerson; // 给类提供一

Java学习之单例设计模式

单例设计模式:解决一个类在内存只存在一个对象. (1) 想要保证对象唯一. a)为了避免其他程序过多建立该类对象.先禁止其他程序建立该类对象 b)还为了让其他程序可以访问到该类对象,只好在本类中,自定义一个对象. c)为了方便其他程序对自定义对象的访问,可以对外提供一些访问方式. (2) 这三部怎么用代码体现呢? a)将构造函数私有化. b)在类中创建一个本类对象. c)提供一个方法可以获取到该对象. (3) 对于事物该怎么描述,还怎么描述. 当需要将该事物的对象保证在内存中唯一时,就将以上的三

设计模式学习笔记——单例设计模式

1.特点:只需一个实例时考虑. 2.概念:保证一个类仅有一个实例,并提供一个供访问的全局点. 3.类图: 4程序实现: 1)懒汉式:对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备.它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回.懒汉模式只在外部对象第一次请求实例的时候才去创建.懒汉模式,它的特点是运行时获得对象的速度比较慢,但加载类的时候比较快.它在整个应用的生命周期只有一部分时

黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模

JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题

一.多线程下的单例设计模式 利用双重判断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Single(); private Single(){} public static Single getInstance() { return t; } } */ //懒汉式 class Single { private static Single t = null; private Single()

【学习笔记】单例设计模式笔记

单例设计模式是常见的设计模式之一.通过单例实现所需求类在系统中只存在唯一一个实例. 单例设计模式分两种:懒汉单例设计模式和饿汉单例设计模式,两者设计思路一致,实现有微小不同. 实现代码: 1 public class HungryMan { 2 3 private HungryMan(){};//私有的构造方法保证HungryMan类无法在外部使用构造方法实例化 4 private static final HungryMan hungryMan=new HungryMan();//在类内定义一

JAVA学习第十课(单例设计模式)

杂谈: 如果一个类里的方法都是静态的,那么就没有必要创建对象,为了不让其他程序创建对象,就可以把当前类的构造函数私有化. class MAN { private MAN() { } } 文档注释:命令:javadoc 只能解析/** 开始至 */结束的内容:/* */则不行 路径设置问题: 当要运行,两个以上路径中的class文件时,路径都要设置,命令:classpath=.;c:\myhelp或者:classpath=.;%myhelp% 清除路径: set classpath= 设计模式:对

黑马程序员-学习日记(单例设计模式的两种类型)

单例设计模式:解决一个类在内存中只有一个对象 多个程序使用统一配置信息对象时,需要保证该对对象的唯一性. 保证对象唯一性的实现步骤: 1.将构造函数私有化:为了避免其他程序过多建立该对象,禁止其他程序调用该对象. 2.在类中创建一个本类对象:为了让其他程序可以访问该类对象 3.提供一个方法可以获取到该对象的方法:方便其他程序访问自定义的本类对象.(类方法的访问方式只有两种,建立对象或定义为静态方法)