设计模式 - 单例模式

设计模式 - 单例模式

ID:40316777

大小:149.00 KB

页数:7页

时间:2019-07-31

设计模式 - 单例模式_第1页
设计模式 - 单例模式_第2页
设计模式 - 单例模式_第3页
设计模式 - 单例模式_第4页
设计模式 - 单例模式_第5页
资源描述:

《设计模式 - 单例模式》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、设计模式读书笔记-----单例模式有时候某些对象我们只需要一个,如:线程池、缓存、对话框等等,对于这类对象我们只能有一个实例,如果我们制造出多个实例,就会导致很多问题产生。但是我们怎样才能保证一个类只有一个实例并且能够便于访问?这里我们想到了全局变量,全局变量确实是可以保证该类可以随时访问,但是它很难解决只有一个实例问题。最好的办法就是让该自身来负责保存它的唯一实例。这个类必须要保证没有其他类来创建它。这里我们可以将其构造方法私有化。即1PublicMyClass{2PrivateMyClass(){}3}含有私有化构造器的类就能保证它不能被

2、其他类实例化了。但是我们如何来获取这个实例化类呢?提供一个方法用于返回该类的实例对象即可实现。1publicclassMyClass{2privateMyClass(){34}56publicstaticMyClassgetInstance(){7returnnewMyClass();8}9}一、基本定义通过上面简单介绍,我们可以对单例模式有一个简单的认识。所谓单例模式就是确保某一个类只有一个实例,并且提供一个全局访问点。从上面可以看出单例模式有如下几个特点:一、它只有一个实例。二、它必须要自行实例化。三、它必须自行想整个系统提供访问点。二、

3、模式结构单例模式可以说是最简单的设计模式了,它仅有一个角色Singleton。Singleton:单例。三、模式实现1publicclassSingleton{2//利用静态变量来记录Singleton的唯一实例3privatestaticSingletonuniqueInstance;45/*6*构造器私有化,只有Singleton类内才可以调用构造器7*/8privateSingleton(){910}1112publicstaticSingletongetInstance(){13if(uniqueInstance==null){14u

4、niqueInstance=newSingleton();15}1617returnuniqueInstance;18}1920}在《HeadFirst》有这样一个场景,就是说有两个线程都要执行这段代码,很有可能会产生两个实例对象。如下图:这里有三种解决方案。第一、使用synchronized来处理。也就是说将getInstance()方法变成同步方法即可。1publicclassSingleton{2//利用静态变量来记录Singleton的唯一实例3privatestaticSingletonuniqueInstance;45/*6*构造

5、器私有化,只有Singleton类内才可以调用构造器7*/8privateSingleton(){910}1112publicstaticsynchronizedSingletongetInstance(){13if(uniqueInstance==null){14uniqueInstance=newSingleton();15}1617returnuniqueInstance;18}1920}第二、直接初始化静态变量。这样就保证了线程安全。1publicclassSingleton{2/*3*利用静态变量来记录Singleton的唯一实例4

6、*直接初始化静态变量,这样就可以确保线程安全了5*/6privatestaticSingletonuniqueInstance=newSingleton();78/*9*构造器私有化,只有Singleton类内才可以调用构造器10*/11privateSingleton(){1213}1415publicstaticSingletongetInstance(){16returnuniqueInstance;17}1819}第三、用“双重检查加锁”,在getInstance()中减少使用同步。1publicclassSingleton{2/*3

7、*利用静态变量来记录Singleton的唯一实例4*volatile关键字确保:当uniqueInstance变量被初始化成Singleton实例时,5*多个线程正确地处理uniqueInstance变量6*7*/8privatevolatilestaticSingletonuniqueInstance;910/*11*构造器私有化,只有Singleton类内才可以调用构造器12*/13privateSingleton(){1415}1617/*18*19*检查实例,如果不存在,就进入同步区域20*/21publicstaticSinglet

8、ongetInstance(){22if(uniqueInstance==null){23synchronized(Singleton.class){//进入同步区

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。