单例设计模式-02-单例两种设计模式(完善)

  1 //
  2 //  ViewController.m
  3 //  01-单例设计模式
  4 //
  5 //  Created by mac on 16/4/22.
  6 //  Copyright © 2016年 mac. All rights reserved.
  7 //
  8 #import "LYMusicTool.h"
  9
 10 #import "ViewController.h"
 11
 12 @interface ViewController ()
 13
 14 @end
 15
 16 @implementation ViewController
 17 /**
 18  *
 19     1> .static 修饰不同东西有不同作用域:修饰全局变量(当前文件),
 20     2> .extern 可以引用其他文件的全局变量
 21
 22     3> .单例:三部曲(全局id类型静态static对象+接口方法+重写allocWithZone:)+1(接口)
 23         1).懒方式-->>第一次用到单例对象时,再创建
 24         2).饿汉式-->>程序类一加载就创建单例对象    重写load方法
 25  */
 26
 27 - (void)viewDidLoad {
 28     [super viewDidLoad];
 29
 30 //    [self textB];
 31 }
 32
 33 /**
 34  *  extern引用的使用
 35  */
 36 - (void)textB {
 37
 38    LYMusicTool *tool = [LYMusicTool sharedMusicTool];
 39     //引用某个全局变量,(并非定义)
 40     extern id _music;
 41     _music = nil;
 42     NSLog(@"%@ === %@ ", _music, tool);
 43 }
 44
 45 /**
 46  *  1. 懒汉式->单例
 47  */
 48 - (void)textA {
 49
 50     LYMusicTool *musicTool1 = [[LYMusicTool alloc] init];
 51     LYMusicTool *musicTool2 = [musicTool1 copy];
 52     LYMusicTool *musicTool3 = [musicTool2 copy];
 53     LYMusicTool *tool4 = [LYMusicTool sharedMusicTool];
 54     LYMusicTool *tool5 = [LYMusicTool sharedMusicTool];
 55
 56     NSLog(@"=%p==%p==%p=", musicTool3, tool4, tool5);
 57 }
 58
 59 @end
 60
 61 ////////////////////////////////02-华丽的分割线///////////////////////////////
 62
 63 //
 64 //  LYMusicTool.m
 65 //  01-单例设计模式 -->>1).懒汉式
 66 //
 67 //  Created by mac on 16/4/22.
 68 //  Copyright © 2016年 mac. All rights reserved.
 69
 70 //alloc的本质是调用:-->>allocWithZone:方法
 71
 72 #import "LYMusicTool.h"
 73
 74 @implementation LYMusicTool
 75 /**
 76  *  1. 创建一个全局变量,作用域比较广泛,所有的文件中都能够访问
 77  */
 78  id _music;
 79
 80 /**
 81  *  2. 重写allocWithZone:只分配一次内存
 82  */
 83 + (instancetype)allocWithZone:(struct _NSZone *)zone {
 84
 85     if (_music == nil) { //防止频繁加锁
 86         @synchronized(self) { //加互斥锁防止多线程同时进来访问,更加安全,真正的单例
 87             if (!_music) { //防止创建多次
 88                 _music = [super allocWithZone:zone];
 89             }
 90         }
 91     }
 92     return _music;
 93 }
 94
 95 /**
 96  *  3. 既保证了单例(只分配一次内存),又保证了只init一次;
 97  */
 98 + (instancetype)sharedMusicTool {
 99
100     if (_music == nil) { //防止频繁加锁
101         @synchronized(self) {
102             if (!_music) { //防止:创建多次和多次初始化
103                 _music = [[self alloc] init];
104             }
105         }
106     }
107     return _music;
108 }
109
110 /**
111  *  5.copy使用
112  *
113  *  1). 遵守coping协议
114  *  2). 重写协议方法copyWithZone:拦截copy产生新对象
115  *  3). 不用判断_music是否空,是因为copy的前提是有对象,有对象 所以_music有值
116  */
117 - (id)copyWithZone:(NSZone *)zone {
118
119     return _music;
120 }
121 @end
122
123 ////////////////////////////////03-华丽的分割线///////////////////////////////
124
125 //
126 //  LYLazyTool.m
127 //  01-单例设计模式  :2)饿汉式
128 //
129 //  Created by mac on 16/4/22.
130 //  Copyright © 2016年 mac. All rights reserved.
131 //
132
133 #import "LYLazyTool.h"
134
135 @implementation LYLazyTool
136 static id _instance;
137
138 + (instancetype)sharedLazyTool {
139
140     return _instance;
141 }
142
143 + (instancetype)allocWithZone:(struct _NSZone *)zone {
144
145     if (_instance == nil) {
146         _instance = [super allocWithZone:zone];
147     }
148     return _instance;
149 }
150
151 /**
152  *  当类加载到OC运行时环境中(内存中),就会调用一次(一个类只会加载一次)
153  *  类装载到内存的时候调用
154  */
155 + (void)load {
156
157      NSLog(@"load---");
158     _instance = [[self alloc] init];
159     NSLog(@"load--%@", _instance);
160 }
161 /**
162  *  第一次使用类的时候才会调用
163  */
164 + (void)initialize {
165
166     NSLog(@"initialize---");
167 }
168 @end
时间: 2024-08-27 19:19:55

单例设计模式-02-单例两种设计模式(完善)的相关文章

两种设计模式和XML解析

两种设计模式 1.单例模式 模式的保证步骤:单例(是说在一个类中只能有一个对象)三条件 1.1类构造设置私有  private  Play() { } 1.2 定义一个私有的静态的  类类型  变量 private static Play play; 1.3 定义共有的 静态的 并且 返回值类型为 类类型 的方法 public static Play GetInstance() { if(play==null) { play=new Play(); } retuen play; } 2.简单工厂

两种设计模式的结合案例

摘要 本学期我学习了“设计模式-可复用面向对象软件的基础”这门课程,这次我采用的是命令模式+策略模式两种设计模式结合的案例. 分析的案例为:遥控器控制天花板上的吊扇,它有多种转动速度,当然也允许被关闭.假设吊扇速度:高.中.低 .关闭.采用安全模式+策略设计模式. 报告整体结构为:两种设计模式的分析.理解,类图,实例分析.代码分析,总结. 目录 第一章 命令模式+策略模式 1 1.1 命令模式 1 1.1.1 定义 1 1.1.2 命令模式的结构 1 1.1.3 角色 1 1.1.4 优点 2

线程的两种设计模式

1.模版模式: 父类实现算法,子类实现细节(一个线程启动的start方法,为什么我们要去实现run方法呢,因为Thread这个类的设计是采用template designer) package com.jack.templatedesigner; abstract class StartProgram { protected String name; public StartProgram(String name){ this.name = name; } //不想让调用者关注到我们实现的细节,

Spring 实现两种设计模式:工厂模式和单态模式

在Spring 中大量使用的以下两种设计模式:工厂模式和单态模式. 工厂模式可将Java 对象的调用者从被调用者的实现逻辑中分离出来,调用者只需关心被调用者必须满足的规则(接口) ,而不必关心实例的具体实现过程.这是面向接口编程的优势,能提高程序的解耦,避免所有的类以硬编码方式耦合在一起. 如果所有的类直接耦合,极易形成"骨牌效应",假如B 类调用了A 类,一旦A 类需要修改,则B 类也需要修改:假如C 类调用了B 类,则C 类也需要修改......依次类推,从而导致整个系统都需要改写

C#设计模式(0):C#的23种设计模式概括

创建型:         1. 单件模式(Singleton Pattern)         2. 抽象工厂(Abstract Factory)         3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method)         5. 原型模式(Prototype) 结构型:         6. 适配器模式(Adapter Pattern)         7. 桥接模式(Bridge Pattern)         8. 装饰模式(Decorator

java:常用的两种设计模式(单例模式和工厂模式)

一.单例模式:即一个类由始至终只有一个实例.有两种实现方式(1)定义一个类,它的构造方法是私有的,有一个私有的静态的该类的变量在初始化的时候就实例化,通过一个公有的静态的方法获取该对象.Java代码 1. //单例模式的第一种形式    2. public class Singleton01 {    3.    4.     // 私有的静态属性    5.     private static Singleton01 instance = new Singleton01();    6.  

【设计模式】GOF设计模式趣解(23种设计模式)

创建型模式                   1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了.麦当劳和肯德基就是生产鸡翅的Factory                   工厂模式:客户类和工厂类分开.消费者任何时候需要某种产品,只需向工厂请求即可.消费者无须修改就可以接纳新产品.缺点是当产品修改时,工厂类也要做相应的修改.如:如何创建及如何向客户端提供.      

两种设计模式(2)==>>"单例"

所谓“单例”: 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. C#中的例子: 转:http://www.cnblogs.com/xun126/archive/2011/03/09/1970807.html 一.经典模式: public class Singleton { private

判断单链表是否有环的两种方法(转)

如图,如果单链表有环,则在遍历时,在通过6之后,会重新回到3,那么我们可以在遍历时使用两个指针,看两个指针是否相等. 方法一:使用p.q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样.如图,当p从6走到3时,用了6步,此时若q从head出发,则只需两步就到3,因而步数不等,出现矛盾,存在环方法二:使用p.q两个指针,p每次向前走一步,q每次向前走两步,若在某个时候p == q,则存在环. #include <stdio.h> #include <st