zoukankan      html  css  js  c++  java
  • 单例设计模式

    单例设计模式

    基本概念

    单例设计模式运用较为普遍、广泛且较为简单的设计模式之一,它的设计原理是始终返回一个实例,即一个类始终只有一个实例。

     

    创建单例的基本步骤

    • 声明一个单例对象的静态实例
    • 创建一个类的类工厂方法,生成一个该类的实例,当且仅当这个类的实例为nil时。
    • 覆盖 allocWithZone: 方法,确保用户程序员在直接分配和初始化对象时,不会产生另一个对象。
    • 实现 NSCopying 协议,覆盖 release,autorelease,retain,retainCount 方法,以此确保单例的状态。
    • 在多线程的环境中,注意使用@synchronized 关键字,确保静态实例被正确的创建和实例化。

    单例基本实现

    static UserContext *segtonInstance = nil;
    
    @implementation UserContext
    
    +(id)shareUserContext{
        @synchronized(self){
            //线程安全
            if (segtonInstance == nil) {
    
                segtonInstance = [[[self class] alloc] init];
            }
        }
        return segtonInstance;
    }
    
    //重写 allocWithZone: 方法
    +(id)allocWithZone:(NSZone *)zone{
        if (segtonInstance == nil) {
            segtonInstance = [super allocWithZone:zone];
        }
        return segtonInstance;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return segtonInstance;
    }

     

    //覆盖 release,autorelease,retain,retainCount 方法方法
    
    //返回本身
    -(id)retain
    {
        return self;
    }
    
    -(NSInteger)retainCount
    {
        return UINT_MAX;
    }
    
    -(id)autorelease{
        return self;
    }
    -(oneway void)release
    {
    
    }
    //验证单例
      UserContext *user1 = [UserContext shareUserContext];
            UserContext *user2 = [UserContext shareUserContext];
            UserContext *user3 = [[UserContext alloc] init];
            UserContext *user4 = [[UserContext alloc] init];
            UserContext *user5 = [[UserContext copy];
    
            NSLog(@"%@",user1);
            NSLog(@"%@",user2);
            NSLog(@"%@",user3);
            NSLog(@"%@",user4);
            NSLog(@"%@",user5);
  • 相关阅读:
    结对编程(阶段二)
    结对编程 第一阶段
    Git实验
    webpack02
    webpack01
    实验五 单元测试
    实验四 代码审评
    UML建模工具的安装和使用
    实验二 结对编程(阶段二)
    博客园背景的修改
  • 原文地址:https://www.cnblogs.com/ShaoYinling/p/4586988.html
Copyright © 2011-2022 走看看