设计模式--单例模式
来源:互联网 发布:网络爬虫工具 编辑:程序博客网 时间:2024/06/06 02:20
设计模式学习笔记--单例模式的多种实现
以下实现均不考虑采用”暴力方式“获得类的实例,例如:利用发射机制调用私有的构造方法
1、简单的实现(不考虑线程安全)
public Class Singleton{<pre code_snippet_id="216969" snippet_file_name="blog_20140304_6_5334752" name="code" class="java"> private static Singleton instance = null;<pre code_snippet_id="216969" snippet_file_name="blog_20140304_3_4177727" name="code" class="java"> private Singleton(){ }<pre code_snippet_id="216969" snippet_file_name="blog_20140304_4_34052" name="code" class="java"> public static Singleton getInstance(){ if( instance == null) instance = new Singleton (); return instance; }}
2、简单的添加关键字 synchronized 实现线程安全(不考虑系统开销),每次有线程调用getInstance()方法,都需要同步判断。
public Class Singleton{<pre code_snippet_id="216969" snippet_file_name="blog_20140304_6_5334752" name="code" class="java"> private static Singleton instance = null;<pre code_snippet_id="216969" snippet_file_name="blog_20140304_7_1506722" name="code" class="java"> private Singleton(){ }<pre code_snippet_id="216969" snippet_file_name="blog_20140304_9_1267524" name="code" class="java"> public static synchronized Singleton getInstance(){ if( instance == null) instance = new Singleton (); return instance; }}
3、采用 双检查法 实现线程安全:
public class DoubleCheckedLockingSingleton{<pre code_snippet_id="216969" snippet_file_name="blog_20140304_10_1583952" name="code" class="java">
private volatile DoubleCheckedLockingSingleton INSTANCE; private DoubleCheckedLockingSingleton(){} public DoubleCheckedLockingSingleton getInstance(){ if(INSTANCE == null){ synchronized(DoubleCheckedLockingSingleton.class){ if(INSTANCE == null){ INSTANCE = new DoubleCheckedLockingSingleton(); } } } return INSTANCE; }}
4、采用 延时初始化 实现(对性能要求较高时不太可取,兼具了实现 1 和 2 的功能)
public class Singleton { private static class SingletonHolder{ private static Singleton instance = new Singleton(); }<pre code_snippet_id="216969" snippet_file_name="blog_20140304_12_6328244" name="code" class="java"> private Singleton(){ }<pre code_snippet_id="216969" snippet_file_name="blog_20140304_13_6644671" name="code" class="java"> public static Singleton getInstance(){ return SingletonHolder.instance; }}
5、采用 枚举 实现(线程安全的同时还进性了序列化)
枚举实例的创建默认是线程安全的,可以通过Singleton.INSTANCE 访问该单例
public enum Singleton { <pre code_snippet_id="216969" snippet_file_name="blog_20140304_15_3340812" name="code" class="java"> INSTANCE("demo") { <pre code_snippet_id="216969" snippet_file_name="blog_20140304_16_7560934" name="code" class="java"> public void Methods() { // . . . } }; protected abstract void Methods(); }
6、采用 静态工程模式 实现(线程安全 由 JVM 负责实现)
public class Singleton{ private static final Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getSingleton(){ return INSTANCE; }}
0 0
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 设计模式-单例模式
- [设计模式] 单例模式
- 设计模式--单例模式
- 设计模式---单例模式
- 设计模式--单例模式
- 设计模式 -----单例模式
- 设计模式:单例模式
- 正则表达式四
- 图文详解YVU格式
- ListView Item中有button及CheckBox OnItemClick无响应
- 解决ScrollView 与viewpager 焦点冲突
- MySQL性能优化
- 设计模式--单例模式
- windows下memcached安装步骤
- 求两个数的公约数有多少个
- 【学习笔记】Linux基本操作(2)--- Linux文件系统基本结构
- magento 部署solr 搜索引擎
- Android NDK使用Iconv进行编码转换
- Unity3D研究院之挥动武器产生的剑痕特效(四十七)
- ubuntu 安装Mysql
- android中圆角图片(ImageView)