最近有点空闲,想回忆一下java的常用设计模式,也希望能是更多人学习受益,鄙人不是个喜欢啰嗦的人,所以文章中会以简洁,实用的style去描述,不足之处,多多包涵。
单例模式介绍
单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到。比如在Android实际APP 开发中用到的账号信息对象管理,数据库对象(SQLiteOpenHelper)等都会用到单例模式。下面针对一些例子分析一下我们在开发过程中应用单例模式需要注意的点。
为什么要使用单例?
保证一个类只有一个实例, 并提供一个访问他的全局访问点。
希望达到的目的?
1.每次从getInstance()都能返回一个且唯一的一个对象。
2.资源共享情况下,getInstance()必须适应多线程并发访问。
3.提高访问性能。
4.懒加载(Lazy Load),在需要的时候才被构造。
总之就是线程安全,调用效率高,并且可以延迟加载
单例模式的分类
- 饿汉式
- 懒汉式
- 双重检验锁
- 静态内部类
- 枚举
单例与实用类静态方法的区别
也许你会感觉单例会像一个实用类的静态方法。不错,他们之间的确很类似,实用类通常也会采用私有化的构造方法来避免其有实例。但他们还是有很多不同的,比如实用类不用保存状态,仅仅提供一些静态方法或静态属性让你使用,而单例类是有状态的。实用类不能用于继承多态,而单例虽然实例唯一,却可以有子类来继承。实用类只不过是一些方法属性的集合,而单例却有着唯一的对象实例。在具体运用中还得仔细分析决定用哪一种方式。。
单例的实现
- 饿汉式
public class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}
}
由代码可以看出当只加载此类就会new新的内存控件,但是如果没有调用getinstance方法的时候会浪费资源,并且没有加同步,调用的效率比较高。
优点:
- 线程安全
- 调用效率高
不足:
- 不能延迟加载
- 懒汉式
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {
}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
每次调用getInstance方法都会加同步,会造成效率降低。
优点:
- 线程安全
可以延迟加载
不足:调用效率不高
- 双重检锁
public class DoubleCheckLockSingleton {
private static volatile DoubleCheckLockSingleton instance;
private DoubleCheckLockSingleton(){
}
public static DoubleCheckLockSingleton getInstance(){
if (instance==null){
synchronized (DoubleCheckLockSingleton.class){
if (instance==null){
instance=new DoubleCheckLockSingleton();
}
}
}
return instance;
}
}
优点:
- 线程安全
- 调用效率高
- 可以延迟加载
- 静态内部类
public class StaticInnerSingleton {
private static class StaticInnerInstance {
private static StaticInnerSingleton instance = new StaticInnerSingleton();
}
private StaticInnerSingleton() {
}
public static StaticInnerSingleton getInstance() {
return StaticInnerInstance.instance;
}
}
优点:
- 线程安全
- 调用效率高
- 可以延迟加载
- . 枚举
public enum EnumSingleton {
Instance;
private int count;
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public void otherMethod(){
}
}
优点:
- 线程安全
- 调用效率高
不足: - 不能延迟加载
不同的单例方法要在项目中根据具体的需求去使用,由于单例模式只生成一个实例,它可以严格的控制怎么访问它以及何时访问它,因此使用单例模式可以大大的提高系统的性能。