Java设计模式之单例模式
2016-03-12 10:29
435 查看
单例模式目的:
保证一个类仅有一个实例。
单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化类。
单例模式实现过程注意三点:
1、单例类的构造函数为私有;
2、提供一个自身的静态私有成员变量;
3、提供一个公有的静态工厂方法。
适用环境:
系统要求提供一个唯一的序列号生成器;
客户调用类的单个实例只允许适用一个公共访问节点,除了该公共访问点不能通过其他途径访问该实例。
等等。
例子代码:
经典式单例:
类加载开始就实例化(线程安全):
public class SinglePattern {
private SinglePattern() {
}
private static SinglePattern instance = new SinglePattern();
public static SinglePattern getInstance() {
return instance;
}
}
双重检查锁定单例:
静态内部类单例:
静态内部类实现的单例不管是在线程安全以及同步性能上都比经典式单例以及双重检查锁定单例好些。
用户类调用单例类:
保证一个类仅有一个实例。
单例类拥有一个私有构造函数,确保用户无法通过new关键字直接实例化类。
单例模式实现过程注意三点:
1、单例类的构造函数为私有;
2、提供一个自身的静态私有成员变量;
3、提供一个公有的静态工厂方法。
适用环境:
系统要求提供一个唯一的序列号生成器;
客户调用类的单个实例只允许适用一个公共访问节点,除了该公共访问点不能通过其他途径访问该实例。
等等。
例子代码:
经典式单例:
public class SinglePattern { private SinglePattern() { } private static SinglePattern instance; //加入synchronized同步是为了线程安全 public static synchronized SinglePattern getInstance() { if (instance == null) { instance = new SinglePattern(); } return instance; } }
类加载开始就实例化(线程安全):
public class SinglePattern {
private SinglePattern() {
}
private static SinglePattern instance = new SinglePattern();
public static SinglePattern getInstance() {
return instance;
}
}
双重检查锁定单例:
public class SinglePattern { private SinglePattern() { } private static SinglePattern instance; //双重检查锁定 public static SinglePattern getInstance() { if (instance == null) { synchronized (SinglePattern.class) { if (instance == null) { instance = new SinglePattern(); } } } return instance; } }
静态内部类单例:
public class SinglePattern { private SinglePattern() { } //静态内部类 private static class Holder { private final static SinglePattern INSTANCE = new SinglePattern(); } public static final SinglePattern getInstance() { return Holder.INSTANCE; } }
静态内部类实现的单例不管是在线程安全以及同步性能上都比经典式单例以及双重检查锁定单例好些。
用户类调用单例类:
public class SinglePatternTest { public static void main(String[] args) { SinglePattern.getInstance(); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树