单例

新手谈设计模式

隐身守侯 提交于 2020-04-07 01:48:37
单例模式 很多都会写 面试的时候也经常问 于是乎顺手就写了一个 public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getSingleton(){ return singleton; } } 由于这种启动加载,为了减小负载需要延迟加载 于是有了 public class Singleton { private static Singleton singleton = null; private Singleton(){} public static Singleton getSingleton(){ if(singleton == null) singleton = new Singleton(); return singleton; } } 确实延迟加载了 但如果多线程的话 是不是可能出现多个了呢 于是我们考虑线程安全 进行加锁 public class Singleton { private static Singleton singleton = null; private Singleton() { } public static Singleton getSingleton()

Scala学习之类和属性篇(三):单例与私有构造函数

大兔子大兔子 提交于 2020-03-12 21:46:27
我们知道,要想使用单例那么就必须定义私有构造函数来防止从类的外部来创建类的实例。在Scala中你也可以通过 private 关键字定义类的私有主构造函数来防止从类的外部创建类的实例。 scala> class Person private(name: String) defined class Person warning: previously defined object Person is not a companion to class Person. Companions must be defined together; you may wish to use :paste mode for this. scala> val p = new Person("Ming") <console>:12: error: constructor Person in class Person cannot be accessed in object $iw val p = new Person("Ming") ^ 我们看到在类的外部已经无法使用new关键字来实例化这个类了。那么在Scala中如何实现 getInstance 方法来获取这个对象的实例呢,就是在类的伴生对象中实现这个方法。 scala> :paste // Entering paste mode (ctrl-D to

GCD之用dispatch_once创建单例

给你一囗甜甜゛ 提交于 2020-03-03 21:25:34
单例模式是开发者常用的一种设置模式,常见的实现方式为:在类中编写名为 sharedInstance的方法,该方法只会返回全类共用的单例实例,而不会在每次调用时创建新的实例. 常见的做法是: + (instancetype)sharedUser { static User *_sharedInstance = nil; @synchronized(self) { if (!_sharedInstance) { _sharedInstance = [[self alloc] init]; } } return _sharedInstance; } 为了保证线程安全,上面的代码把创建代理的代码包裹在同步块里. 相对于上面的实现方式,使用GCD的dispatch_once实现起来更为容易. 所用到的函数是: static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // code to be executed once }); 此函数接受的类型为 dispatch_once_t的特殊函数 token,此外还接受块参数.对于给定的token来说,该函数保证相关的块必定会执行,且仅执行一次.首次调用该函数时必然会执行块中的代码, 最重要的是:次操作完全是线程安全的!!!需要注意的是:对于只需执行一次的块来说

iOS中的常用的几种设计模式

隐身守侯 提交于 2019-12-11 11:56:21
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 总结一下自己在开发中经常用的一些 设计模式 (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。 优势:解耦合 敏捷原则:开放-封闭原则 实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。 列表row个数delegate 自定义的delegate (二)观察者模式 应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。 优势:解耦合 敏捷原则:接口隔离原则,开放-封闭原则 实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。 kvo,键值对改变通知的观察者,平时基本没用过。 (三)MVC模式 应用场景:是一中非常古老的 设计模式 ,通过 数据模型 ,控制器逻辑,视图展示将应用程序进行逻辑划分。 优势:使系统,层次清晰,职责分明,易于维护 敏捷原则:对扩展开放-对修改封闭 实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。 (四) 单例模式 应用场景:确保程序运行期某个类,只有一份实例,用于进行 资源共享 控制。 优势:使用简单,延时求值,易于跨模块 敏捷原则

《Java-单例模式》

人走茶凉 提交于 2019-12-07 13:52:02
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。 那就让我们看看几种常见的单例模式吧。 //懒汉式单例类.在第一次调用的时候实例化自己 public class Singleton { private Singleton() {} private static Singleton single=null; //静态工厂方法 public static Singleton getInstance() { if (single == null) { single = new Singleton(); } return single; } } 应该是大家写的比较多的了,但是这种写法的时候在多线程的时候就会出现问题,于是就引出了下面两种写法 1、在getInstance方法上加同步 public static synchronized Singleton

Jersey+Spring:解决Jersey单实例问题

这一生的挚爱 提交于 2019-12-05 07:07:09
Jersey是一款优秀的webservice框架,它同时支持soap和rest两种协议,而且系出名门(oracle)。美中不足的是: Jersey是基于Servlet实现的,具有Servlet的单例特性,有线程安全问题的隐患 (这点跟Struts1.x很像)。 通过将Jersey与Spring整合,利用Spring托管Jersey服务实例的生成,即针对每一个客户端请求都生成一个服务实例,可以很好的解决Jersey的单实例问题。 本文不再赘述Jersey与Spring的整合,只讲解如何让Spring针对每一个请求(request)都生成新的Jersey服务实例, 具体方法有如下两种: (1) request scope: @Component @Scope("request") @Path("/WebServiceDemoImpl") public class WebServiceDemoImpl implements WebServiceDemo{ 加入@Scope("request")注解后,Spring会针对每一个request请求都生成新的Jersey服务类实例 (实际上spring并不是采用这种机制保障线程安全的,我这么说是为了便于理解) 。但使用request scope还要在web.xml文件中加入Spring RequsetContextListener的配置:

【单例设计模式】单例模式中为什么用枚举更好

ⅰ亾dé卋堺 提交于 2019-11-30 11:02:16
枚举单例(Enum Singleton)是实现单例模式的一种新方式,尽管单例模式在java中已经存在很长时间了,但是枚举单例相对来说是一种比较新的概念,枚举这个特性是在Java5才出现的,这篇文章主要讲解关于为什么我们应该使用枚举来实现单例模式,它与传统方式实现的单例模式相比较又有哪些优势? 1. 枚举写法简单 写法简单这是它最大的优点,如果你先前写过单例模式,你应该知道即使有DCL(double checked locking) 也可能会创建不止一个实例,尽管在Java5这个问题修复了(jdk1.5在内存模型上做了大量的改善,提供了volatile关键字来修饰变量),但是仍然对新手来说还是比较棘手。对比通过double checked locking 实现同步,枚举单例那实在是太简单了。如果你不相信那么对比下面代码,分别为传统的用double checked locking实现的单例和枚举单例。 枚举实现: 下面这段代码就是声明枚举实例的通常做法,它可能还包含实例变量和实例方法,但是为了简单起见,我并没有使用这些东西,仅仅需要小心的是如果你正在使用实例方法,那么你需要确保线程安全(如果它影响到其他对象的状态的话)。默认枚举实例的创建是线程安全的,但是在枚举中的其他任何方法由程序员自己负责。 /** * Singleton pattern example using Java

Hutool之单例池——Singleton

二次信任 提交于 2019-11-29 07:23:20
为什么会有这个类 平常我们使用单例不外乎两种方式: 在对象里加个静态方法getInstance()来获取。此方式可以参考 【转】线程安全的单例模式 这篇博客,可分为饿汉和饱汉模式。 通过Spring这类容器统一管理对象,用的时候去对象池中拿。Spring也可以通过配置决定懒汉或者饿汉模式 说实话我更倾向于第二种,但是Spring更对的的注入,而不是拿,于是我想做Singleton这个类,维护一个单例的池,用这个单例对象的时候直接来拿就可以,这里我用的懒汉模式。我只是想把单例的管理方式换一种思路,我希望管理单例的是一个容器工具,而不是一个大大的框架,这样能大大减少单例使用的复杂性。 使用 package com.xiaoleilu.hutool.demo; import com.xiaoleilu.hutool.Singleton; /** * 单例样例 * @author loolly * */ public class SingletonDemo { /** * 动物接口 * @author loolly * */ public static interface Animal{ public void say(); } /** * 狗实现 * @author loolly * */ public static class Dog implements Animal{

objective-c设计模式之---单例

最后都变了- 提交于 2019-11-28 22:29:27
单例模式可以说是每个应用都有用到的一个模式,在iOS的世界里更是常见。例如我们的UIApplication sharedApplicaiton应用的就是单利模式, defaultManager和defaultCenter等也是常见的单利。这也是为什么人们经常把CoreData的实例变量放在 UIApplication里面。 对单例有了更清楚的了解以后,我们可以让我们的代码更加清晰。比如,我们可以把放在AppDelegate里的关于CoreData的代码移植到其他的单例类里面。 在相关网络博客上面看到了下面三种实现单利的方法。 1. 使用GCD实现单线程实现(给一篇参考文章 http://bj007.blog.51cto.com/1701577/649413 ) void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);其中第一个参数 predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数则是在整个应用程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次,而且还是线程安全。 @implementation MyClass #pragma mark Singleton Methods + (id)sharedClass { static

Head First Design Pattern 读书笔记(4) 单例模式

蓝咒 提交于 2019-11-27 10:28:36
Head First Design Pattern 读书笔记(4) Singleton Pattern 单例模式 ###Silngleton Pattern 类图 单例模式非常简单,基本没有什么类之间的关系,就不画图了,保证某个类生成的实例只有一个即可。 ###定义 单例模式:只允许一个类实例化一个对象,并提供一个可以全局访问这个实例的方法(接口)。 ###关于单例模式 最简单的单例模式实现方法是: /* *“懒汉式”写法,即等要用了再去实例化实例对象,而不是应用一启动就实例化好放在容器中。 */ public class Singleton { private Singleton(); private static Singleton instance; public static getSingleton(){ if(instance==null){ instance = new Sinleton(); } return instance; } } 1中实现的singleton在多线程中可能会有多个线程同时实例化,导致实例对象不止一个的问题,解决方案是使用同步锁,或者使用“饿汉式”的写法。 //双重检查锁的写法,因为使用了volatile关键字,需要jdk1.4以上 public class Singleton { private Singleton(); private