zoukankan      html  css  js  c++  java
  • 单例模式的实现

    1.单例模式的作用

    • 可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问.
    • 从而方便的控制了实例个数,并节约系统资源

    2.单例模式的使用场合

    • 在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)

    3.单例模式的实现

    • 实现单例模式,共有两种方法.一种较为复杂.一种比较简易

    第一种: 复杂实现方法

    • 优点 : 外界调用这个工具类时,可以通过类方法来获取单例,也可以通过alloc的方法来获取单例
    // 1.提供静态变量
    static MTYTool * _instance;
    
    // 2.重写该方法,保证只分配一次内存空间
    + (instancetype)allocWithZone:(struct _NSZone *)zone {
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [super allocWithZone:zone];
        });
        return _instance;
        
    }
    
    // 3.提供类方法
    + (instancetype)shareTool {
        return [[self alloc] init];
    }
    
    // 4.更加严谨的做法
    - (id)copyWithZone:(NSZone *)zone {
        return _instance;
    }
    
    - (id)mutableCopyWithZone:(NSZone *)zone {
        return _instance;
    }
    

    外界调用测试

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        MTYTool *t1 = [[MTYTool alloc] init];
        MTYTool *t2 = [MTYTool new];
        
        // 打印结果: t1--<MTYTool: 0x600000011d10>, t2--<MTYTool: 0x600000011d10
    //    NSLog(@"t1--%@, t2--%@",t1,t2);
        
        // 打印结果: t1--<MTYTool: 0x608000000e30>, t2--<MTYTool: 0x608000000e30>, ---<MTYTool: 0x608000000e30>,---<MTYTool: 0x608000000e30>
    //    NSLog(@"t1--%@, t2--%@, ---%@,---%@", t1, t2, [MTYTool shareTool], [MTYTool shareTool]);
        
        // 打印结果: t1--<MTYTool: 0x6000000137c0>, t2---<MTYTool: 0x6000000137c0>, <MTYTool: 0x6000000137c0>, <MTYTool: 0x6000000137c0>
    //    NSLog(@"t1--%@, t2---%@, %@, %@",t1, t2, [t1 copy], [t1 mutableCopy]);
    

    第二种: 简易实现方法

    • 弊端 : 外界调用这个工具类时,只能通过类方法来获取单例,不能通过alloc的方法来获取单例了
    + (instancetype)shareDownloadTool {
        
        static MTYEasyTool *_instance;
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [[self alloc] init];
        });
        
        return _instance;
    }
    

    外界调用测试

    - (void)viewDidLoad {
        [super viewDidLoad];
    
        MTYEasyTool *easy1 = [MTYEasyTool shareDownloadTool];
        MTYEasyTool *easy2 = [MTYEasyTool shareDownloadTool];
        // 打印结果:1--<MTYEasyTool: 0x600000004cd0>, 2--<MTYEasyTool: 0x600000004cd0>
        NSLog(@"1--%@, 2--%@", easy1, easy2);
        
        MTYEasyTool *easy3 = [[MTYEasyTool alloc] init];
        MTYEasyTool *easy4 = [[MTYEasyTool alloc] init];
        // 打印结果:3--<MTYEasyTool: 0x60800001ce90>, 4--<MTYEasyTool: 0x60800001cea0>
        NSLog(@"3--%@, 4--%@",easy3, easy4);
    }
    
  • 相关阅读:
    类的有参方法
    WPF 中的设备无关单位
    Skelta BPM.NET 2006 初探
    Reporting Services Handscript
    C语言I博客作业03
    C语言I博客作业02
    C++类的运算符重载和转换函数结合的问题
    C++ 函数返回类成员的问题
    kaggle 利用linear regression 进行房价预测
    android Could not open: c:\。。。。\.android/avd/XXXX.ini 问题和解决方法
  • 原文地址:https://www.cnblogs.com/mtystar/p/6412708.html
Copyright © 2011-2022 走看看