swift单例模式怎么写

1.如何写一个简单的单例模式

一、基本的实现思路:

单例的实现主要是通过以下两个步骤:

1、将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;

2、在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。

二、示范如下:

1、枚举实现单例:

2、懒汉式线程不安全:

3、懒汉式线程安全:

4、饿汉式:

5、双重校验锁:

6、静态内部类:

扩展资料:

一、单列模式简介:

单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。

二、懒汉与饿汉:

1、懒汉方式:指全局的单例实例在第一次被使用时构建。

2、饿汉方式:指全局的单例实例在类装载时构建。

三、单例模式的三要点:

1、某个类只能有一个实例。

2、它必须自行创建这个实例。

3、它必须自行向整个系统提供这个实例。

四、优缺点:

1、优点:

①实例控制:单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。

②灵活性:因为类控制了实例化过程,所以类可以灵活更改实例化过程。

2、缺点:

①开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。

②可能的开发混淆:使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。

③对象生存期:不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。

参考资料:百度百科单列模式

2.单例模式代码怎么写

单例模式(Singleton) ,属于最常见的设计模式之一,大部分系统都会用到,目的是为了维护系统中唯一的一个实例。

可分为eager模式,示例代码如下: Java代码 1.class EagerSingleton{ 2. private static final EagerSingleton m_instance = new EagerSingleton(); 3. private EagerSingleton(){} 4. public static EagerSingleton getInstance(){ 5. return m_instance; 6. } 7.} class EagerSingleton{ private static final EagerSingleton m_instance = new EagerSingleton(); private EagerSingleton(){} public static EagerSingleton getInstance(){ return m_instance; } } 和 lazy模式,示例代码如下: Java代码 1.class LazySingleton{ 2. private static LazySingleton m_instance = null; 3. private LazySingleton(){} 4. public synchronized static getInstance(){ 5. if(m_instance == null){ 6. m_instance = new LazySingleton(); 7. } 8. return m_instance; 9. } 10.} class LazySingleton{ private static LazySingleton m_instance = null; private LazySingleton(){} public synchronized static getInstance(){ if(m_instance == null){ m_instance = new LazySingleton(); } return m_instance; } } java源码中,Runtime.getRuntime()就是单例的一个例子。 单例模式的精神就是整个系统中维护一个实例,推广开来,如果在一个系统中需要维护多个示例,那么就产生了多例模式(multiton)。

多例模式(Multiton) ,通过聚集对象了保留自身的多个示例,根据客户端的参数返回所需要的实例。 示例代码如下: Java代码 1.class Multiton{ 2. private final int INSTANCE_SIZE = 10; 3. private static Map instances = new HashMap(INSTANCE_SIZE); 4. private String name; 5. private Multiton(){} 6. private Multiton(String name){ 7. this.name = name; 8. } 9. public synchronized static getInstance(String name){ 10. if(instances.containsKey(name)){ 11. return instances.get(name); 12. } 13. else{ 14. ins = new Multiton(name); 15. instances.put(name, ins); 16. return ins; 17. } 18. } 19.} class Multiton{ private final int INSTANCE_SIZE = 10; private static Map instances = new HashMap(INSTANCE_SIZE); private String name; private Multiton(){} private Multiton(String name){ this.name = name; } public synchronized static getInstance(String name){ if(instances.containsKey(name)){ return instances.get(name); } else{ ins = new Multiton(name); instances.put(name, ins); return ins; } } } [nextpage] 一个实用的例子就是KeyGenerator, 示例代码如下: Java代码 1.class KeyGenerator{ 2. private final int POOL_SIZE = 20; 3. private static Map instances = new HashMap(16); 4. private KeyInfo keyinfo; 5. private KeyGenerator(){} 6. private KeyGenerator(String keyName){ 7. this.keyinfo = new KeyInfo(POOL_SIZE, keyName); 8. } 9. public synchronized static getInstance(String keyName){ 10. if(instances.containsKey(keyName)){ 11. return (KeyGenerator)instances.get(keyName); 12. } 13. else{ 14. keyGen = new KeyGenerator(keyName); 15. instances.put(name, keyGen); 16. return keyGen; 17. } 18. } 19. public synzhronized int getNextKey(){ 20. return keyinfo.getNextKey(); 21. } 22. } class KeyGenerator{ private final int POOL_SIZE = 20; private static Map instances = new HashMap(16); private KeyInfo keyinfo; private KeyGenerator(){} private KeyGenerator(String keyName){ this.keyinfo = new KeyInfo(POOL_SIZE, keyName); } public synchronized static getInstance(String keyName){ if(instances.containsKey(keyName)){ return (KeyGenerator)instances.get(keyName); } else{ keyGen = new KeyGenerator(keyName); instances.put(name, keyGen); return keyGen; } } public synzhronized int getNextKey(){ return keyinfo.getNextKey(); } }。

3.单例模式代码怎么写

单例模式(Singleton) ,属于最常见的设计模式之一,大部分系统都会用到,目的是为了维护系统中唯一的一个实例。

可分为eager模式,示例代码如下: Java代码 1.class EagerSingleton{ 2. private static final EagerSingleton m_instance = new EagerSingleton(); 3. private EagerSingleton(){} 4. public static EagerSingleton getInstance(){ 5. return m_instance; 6. } 7.} class EagerSingleton{ private static final EagerSingleton m_instance = new EagerSingleton(); private EagerSingleton(){} public static EagerSingleton getInstance(){ return m_instance; } } 和 lazy模式,示例代码如下: Java代码 1.class LazySingleton{ 2. private static LazySingleton m_instance = null; 3. private LazySingleton(){} 4. public synchronized static getInstance(){ 5. if(m_instance == null){ 6. m_instance = new LazySingleton(); 7. } 8. return m_instance; 9. } 10.} class LazySingleton{ private static LazySingleton m_instance = null; private LazySingleton(){} public synchronized static getInstance(){ if(m_instance == null){ m_instance = new LazySingleton(); } return m_instance; } } java源码中,Runtime.getRuntime()就是单例的一个例子。 单例模式的精神就是整个系统中维护一个实例,推广开来,如果在一个系统中需要维护多个示例,那么就产生了多例模式(multiton)。

多例模式(Multiton) ,通过聚集对象了保留自身的多个示例,根据客户端的参数返回所需要的实例。 示例代码如下: Java代码 1.class Multiton{ 2. private final int INSTANCE_SIZE = 10; 3. private static Map instances = new HashMap(INSTANCE_SIZE); 4. private String name; 5. private Multiton(){} 6. private Multiton(String name){ 7. this.name = name; 8. } 9. public synchronized static getInstance(String name){ 10. if(instances.containsKey(name)){ 11. return instances.get(name); 12. } 13. else{ 14. ins = new Multiton(name); 15. instances.put(name, ins); 16. return ins; 17. } 18. } 19.} class Multiton{ private final int INSTANCE_SIZE = 10; private static Map instances = new HashMap(INSTANCE_SIZE); private String name; private Multiton(){} private Multiton(String name){ this.name = name; } public synchronized static getInstance(String name){ if(instances.containsKey(name)){ return instances.get(name); } else{ ins = new Multiton(name); instances.put(name, ins); return ins; } } } [nextpage] 一个实用的例子就是KeyGenerator, 示例代码如下: Java代码 1.class KeyGenerator{ 2. private final int POOL_SIZE = 20; 3. private static Map instances = new HashMap(16); 4. private KeyInfo keyinfo; 5. private KeyGenerator(){} 6. private KeyGenerator(String keyName){ 7. this.keyinfo = new KeyInfo(POOL_SIZE, keyName); 8. } 9. public synchronized static getInstance(String keyName){ 10. if(instances.containsKey(keyName)){ 11. return (KeyGenerator)instances.get(keyName); 12. } 13. else{ 14. keyGen = new KeyGenerator(keyName); 15. instances.put(name, keyGen); 16. return keyGen; 17. } 18. } 19. public synzhronized int getNextKey(){ 20. return keyinfo.getNextKey(); 21. } 22. } class KeyGenerator{ private final int POOL_SIZE = 20; private static Map instances = new HashMap(16); private KeyInfo keyinfo; private KeyGenerator(){} private KeyGenerator(String keyName){ this.keyinfo = new KeyInfo(POOL_SIZE, keyName); } public synchronized static getInstance(String keyName){ if(instances.containsKey(keyName)){ return (KeyGenerator)instances.get(keyName); } else{ keyGen = new KeyGenerator(keyName); instances.put(name, keyGen); return keyGen; } } public synzhronized int getNextKey(){ return keyinfo.getNextKey(); } }。

4.单例模式怎样写

class StringManager {

private static StringManager instance;

private Map beanMap;

private StringManager() {

beanMap = new HashMap();

}

public static StringManager getInstance() {

if (instance == null) {

instance = new StringManager();

}

return instance;

}

public Object getBean(String beanName) {

return beanMap.get(beanName);

}

}

5.如何正确地写出单例模式

当被问到要实现一个单例模式时,很多人的第一反应是写出如下的代码,包括教科书上也是这样教我们的。

1234567891011public class Singleton {private static Singleton instance;private Singleton (){}public static Singleton getInstance () {if (instance == null ) {instance = new Singleton();}return instance;}}这段代码简单明了,而且使用了懒加载模式,但是却存在致命的问题。当有多个线程并行调用 getInstance() 的时候,就会创建多个实例。

也就是说在多线程下不能正常工作。懒汉式,线程安全为了解决上面的问题,最简单的方法是将整个 getInstance() 方法设为同步(synchronized)。

123456public static synchronized Singleton getInstance () {if (instance == null ) {instance = new Singleton();}return instance;}虽然做到了线程安全,并且解决了多实例的问题,但是它并不高效。因为在任何时候只能有一个线程调用 getInstance() 方法。

但是同步操作只需要在第一次调用时才被需要,即第一次创建单例实例对象时。这就引出了双重检验锁。

双重检验锁双重检验锁模式(double checked locking pattern),是一种使用同步块加锁的方法。程序员称其为双重检查锁,因为会有两次检查 instance == null ,一次是在同步块外,一次是在同步块内。

为什么在同步块内还要再检验一次?因为可能会有多个线程一起进入同步块外的 if,如果在同步块内不进行二次检验的话就会生成多个实例了。12345678910public static Singleton getSingleton () {if (instance == null ) { //Single Checkedsynchronized (Singleton.class) {if (instance == null ) { //Double Checkedinstance = new Singleton();}}}return instance ;}这段代码看起来很完美,很可惜,它是有问题。

主要在于 instance = new Singleton() 这句,这并非是一个原子操作,事实上在 JVM 中这句话大概做了下面 3 件事情。给 instance 分配内存调用 Singleton 的构造函数来初始化成员变量将instance对象指向分配的内存空间(执行完这步 instance 就为非 null 了)但是在 JVM 的即时编译器中存在指令重排序的优化。

也就是说上面的第二步和第三步的顺序是不能保证的,最终的执行顺序可能是 1-2-3 也可能是 1-3-2。如果是后者,则在 3 执行完毕、2 未执行之前,被线程二抢占了,这时 instance 已经是非 null 了(但却没有初始化),所以线程二会直接返回 instance,然后使用,然后顺理成章地报错。

我们只需要将 instance 变量声明成 volatile 就可以了。 class Singleton {private volatile static Singleton instance; //声明成 volatileprivate Singleton (){}public static Singleton getSingleton () {if (instance == null ) {synchronized (Singleton.class) {if (instance == null ) {instance = new Singleton();}}}return instance;}}有些人认为使用 volatile 的原因是可见性,也就是可以保证线程在本地不会存有 instance 的副本,每次都是去主内存中读取。

但其实是不对的。使用 volatile 的主要原因是其另一个特性:禁止指令重排序优化。

也就是说,在 volatile 变量的赋值操作后面会有一个内存屏障(生成的汇编代码上),读操作不会被重排序到内存屏障之前。比如上面的例子,取操作必须在执行完 1-2-3 之后或者 1-3-2 之后,不存在执行到 1-3 然后取到值的情况。

从「先行发生原则」的角度理解的话,就是对于一个 volatile 变量的写操作都先行发生于后面对这个变量的读操作(这里的“后面”是时间上的先后顺序)。但是特别注意在 Java 5 以前的版本使用了 volatile 的双检锁还是有问题的。

其原因是 Java 5 以前的 JMM (Java 内存模型)是存在缺陷的,即时将变量声明成 volatile 也不能完全避免重排序,主要是 volatile 变量前后的代码仍然存在重排序问题。这个 volatile 屏蔽重排序的问题在 Java 5 中才得以修复,所以在这之后才可以放心使用 volatile。

相信你不会喜欢这种复杂又隐含问题的方式,当然我们有更好的实现线程安全的单例模式的办法。饿汉式 static final field这种方法非常简单,因为单例的实例被声明成 static 和 final 变量了,在第一次加载类到内存中时就会初始化,所以创建实例本身是线程安全的。

12345678910public class Singleton {//类加载时就初始化private static final Singleton instance = new Singleton();private Singleton (){}public static Singleton getInstance (){return instance;}}这种写法如果完美的话,就没必要在啰嗦那么多双检锁的问题了。缺点是它不是一种懒加载模式(lazy initialization),单例会在加载类后一开始就被初始化,即使客户端没有调用 getInstance()方法。

饿汉式的创建方式在一些场景中将无法使用:譬如 Singleton 实例的创建是依赖参数或者配置文件的,在 getInstance() 之前必须调用某个方法设置参数给它,那样这种单例写法就无法使用了。静态内部类 static nested class我比较倾向于使用静态内部类的方法,这种方法也是《Effective Java》上所推荐的。

123456789public class Singleton {private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}private Singleton (){}public 。

6.什么是单例模式 最好写一个简单的单例模式的实现 谢谢

所谓单例模式,就是把构造方法设为private,不能直接去实例化,而要通过一个方法返回该类的实例,也就是拐了个弯而已.

package 积跬步至千里;

public class A

{

private A()

{

}

public static A getA()

{

A a=new A();

return a;

}

public void show()

{

System.out.println("123456");

}

public static void main(String[] args)

{

A a=getA();

a.show();

}

}

7.如何在 swift 中调用 OC 的单例类方法

一、MySingle类

import Foundation

class MySingle{

//定义单例的属性

var name:String?

var age:Int?

var height:Double?

//定义类方法

class func shareInstance()->MySingle{

struct qzSingle{

static var predicate:dispatch_once_t = 0

static var instance:MySingle? = nil

}

dispatch_once(&qzSingle.predicate,{

qzSingle.instance = MySingle()

})

return qzSingle.instance!

}

}二、AppDelegate中调用

//单例的使用

var single = MySingle.shareInstance()

single.name = "秦志伟"

single.age = 24

single.height = 176.00

println(single)运行结果:has 3 children

8.单例模式怎么写,求一份饿汉式单例 一份懒汉式单例

//懒汉式

public class A{

public static A a = null;

public A(){

}

public A getInstance(){

if(a==null){

return new A();

}

return a;

}

}

//饿汉式

public class A{

public static synchonized A a = new A();//线程安全

public A(){

}

public A getInstance(){

return a;

}

}

所谓饿就是急,无论需不需要先将单例对象给创建了,而懒汉式就是慢,需要的时候再创建,此外还有利用java缓存式的,利用内部类实现的单例模式,具体可以参考《清华大学出版社》出版的《研磨设计模式》

swift单例模式怎么写

转载请注明出处育才学习网 » swift单例模式怎么写

知识

笔记本上的date怎么写

阅读(417)

本文主要为您介绍笔记本上的date怎么写,内容包括请问笔记本上的date//怎么填,第一杠杠前面填日还是月,请问笔记本上的date//怎么填,第一杠杠前面填日还是月,笔记本上的NO.和Date是什么意思。NO.指的是编号,Date指的是日期。笔记本电脑型号后

知识

ong字怎么写

阅读(290)

本文主要为您介绍ong字怎么写,内容包括“ong”拼音怎么读,读音为ong的字,押ONG韵的字。只有一个,如下图:

知识

construct的名词怎么写

阅读(1010)

本文主要为您介绍construct的名词怎么写,内容包括他会将这个词的名词,动词,形容词,副词的形式归在一起比如查,assure的名词怎么写,英语单词“建设”怎么写。collection [kəlekʃən] n. 收藏品,收集物 例句: Is the collection going to be

知识

co.ltd分公司怎么写

阅读(289)

本文主要为您介绍co.ltd分公司怎么写,内容包括总公司的英文缩写为CO.LTD,分公司应该如何写,公司名称中,Co.,Ltd.是什么的缩写,请列举co.,ltd的几种正确写法。Co. LTD 是 Company Limited 即“有限责任公司”的缩写,并非“总公司”。总公司一

知识

拧螺丝的拼音怎么写的

阅读(283)

本文主要为您介绍拧螺丝的拼音怎么写的,内容包括拧螺丝的拧怎么读,拧脑袋的读音拧螺丝的读音拧开的读音拧毛巾的读音,拧开螺丝的读音。拧螺丝的拧的拼音是nǐng,拧的意思是控制住物体并向里转或向外转。拧拼 音 :nǐng níng nìng 部 首:扌笔

知识

宁愿的英语单词怎么写

阅读(224)

本文主要为您介绍宁愿的英语单词怎么写,内容包括宁的英文怎么写,单词的英文怎么写,1至100的英文怎么写。单词的英文表示为:word2、word的英式发音为[wɜ:d],美式发音为[wɜ:rd] ,意思有:单词;话语;诺言;消息,措辞,用词;

知识

ftp获取本地路径怎么写

阅读(227)

本文主要为您介绍ftp获取本地路径怎么写,内容包括怎么获取ftp的路径,怎么获取ftp的路径,java读取本地文件路径怎么写。问一下,你是想做ftp上传下载么?首先你需要安装一个ftp服务端程序,启动起来,然后下载一个ftp客户端程序,测试能不能连接,首先这

知识

都暻秀韩文名怎么写

阅读(208)

本文主要为您介绍都暻秀韩文名怎么写,内容包括exo十二个人韩文名怎么写,exo十二个人韩文名怎么写,exo成员韩文名怎样写。中文名/原名韩文名/原名艺名队内担当出生年月日金珉硕/金珉锡김민석XIU MIN副领舞 副主唱1990-03-26鹿晗루한LU HAN主

知识

搞笑鲜花卡片怎么写

阅读(212)

本文主要为您介绍搞笑鲜花卡片怎么写,内容包括送病人的鲜花卡片上,写什么话既搞笑又祝福康复,送花卡片写什么,送一个朋友鲜花卡片上应该写什么。情人节就要到了,送给女朋友一束美丽的鲜花的同时再写上一张有着小小祝福的卡片,放在花中表达自

知识

淮师附小操场怎么写

阅读(161)

本文主要为您介绍淮师附小操场怎么写,内容包括写淮师附小洞山校区的作文,校园一角作文(是淮师附小),校园的操场作文怎么写。过了漫长的暑假,我来到了新校区。我站在校门口,如果用一个最普通的字来形容,那就是大。走进了学校。北面是教导处和食堂

知识

开会笔记怎么写

阅读(264)

本文主要为您介绍开会笔记怎么写,内容包括会议笔记怎么写,开会会议记录怎么写,会议笔记怎么写。会议记录格式一般会议记录的格式包括两部分:一部分是会议的组织情况,要求写明会议名称、时间、地点、出席人数、缺席人数、列席人数、主持人、记

知识

生母k四线格怎么写

阅读(183)

本文主要为您介绍生母k四线格怎么写,内容包括声母k在四线格上怎么写,拼音k在四线格里怎样写,声母t在四线格内怎么写。跟英文的写法差不多啊。**字母书写的规格1.斜度:每个字母都要稍向右斜约10°左右,斜度要一致。2. 大写字母的书写规格是:上

知识

夜总会招聘公关怎么写

阅读(209)

本文主要为您介绍夜总会招聘公关怎么写,内容包括夜总会的公关是做什么的,在夜总会做公关,是做什么工作,酒吧、KTV、夜总会公关请进来回答。淮海中路有很多招聘的,具体我发消息给你.但你自己一定要分辨真假,公司一般情况是不收费的,不要轻易相

知识

爽的笔顺编码怎么写

阅读(212)

本文主要为您介绍爽的笔顺编码怎么写,内容包括爽的笔画顺序怎么写的,爽的笔顺怎么写,爽的笔顺怎么写。“爽”字的笔划顺序:(一丿丶丿丶丿丶丿丶丿丶)横、撇、点、撇、点、撇、点、撇、点、撇、捺。爽shuāng:部首: 爻笔画数: 11笔画:

知识

模式研究论文怎么写

阅读(272)

本文主要为您介绍模式研究论文怎么写,内容包括模式研究论文怎么写(技巧分享),学术论文写作,企业文化模式研究这个毕业论文题目该怎么写大致方向如何,论文研究内容怎么写。(一)题名(Title,Topic)题名又称题目或标题。题名是以最恰当、最简明的词语

知识

单例模式java主函数怎么写

阅读(217)

本文主要为您介绍单例模式java主函数怎么写,内容包括java中的单例模式的代码怎么写,java单例模式怎么写,如何写一个简单的单例模式。我从我的博客里把我的文章粘贴过来吧,对于单例模式模式应该有比较清楚的解释:单例模式在我们日常的项目中十

知识

项目的商业模式怎么写

阅读(226)

本文主要为您介绍项目的商业模式怎么写,内容包括创业企划书的项目摘要、商业模式怎么写,商业模式怎么写,谁知道商业模式计划书怎么写,要写哪些内容。原发布者:南山平子商业模式是一个非常宽泛的概念,通常所说的的跟商业模式有关的说法很多,包

知识

车间带线管理模式怎么写

阅读(247)

本文主要为您介绍车间带线管理模式怎么写,内容包括生产车间的管理方案怎么写,如何去管理车间车间管理模式如何建立,如何结合车间实际,创新车间管理模式。序 二、管理理念和方法 三、实现目标的过程 四、其它改进方法 序: 一个团队就象

知识

xcode怎么写swift

阅读(258)

本文主要为您介绍xcode怎么写swift,内容包括怎么利用xcode开发swift应用程序,想问下xcode和swift什么关系,xcode中用swift语言编写,怎么将文本框中的文本转化为数字。1首先,我们必须在苹果Mac电脑上搭建xcode开发环境。 2打开“xcode”开发

知识

商业模式应该怎么写

阅读(214)

本文主要为您介绍商业模式应该怎么写,内容包括商业模式怎么写,创业企划书的项目摘要、商业模式怎么写,商业运营模式怎么写,求大神。原发布者:南山平子商业模式是一个非常宽泛的概念,通常所说的的跟商业模式有关的说法很多,包括运营模式、盈利

知识

盈利模式怎么写算

阅读(188)

本文主要为您介绍盈利模式怎么写算,内容包括盈利模式怎么写,盈利模式怎么写,盈利模式用一句话怎么描述,如图。您好,一份商业计划书的具体内容是要根据您的具体计划和行文思路来决定的,换言之,只要您能表达清楚您希望表达的意思或者您的表达能

知识

业务运作模式怎么写

阅读(230)

本文主要为您介绍业务运作模式怎么写,内容包括什么是业务模式、商业模式、经营模式、盈利模式以及发展模式搜狗,商业运营模式怎么写,求大神,关于经营模式、管理模式与运作模式。(1)业务模式:简单地说,业务模式是一种业务运作,包括业务要素、业

[/e:loop]