安卓之单例模式

来源:互联网 发布:在手机淘宝上如何评论 编辑:程序博客网 时间:2024/05/02 01:06

【背景】

 1.大部分时候,我们把类的构造器定义成public访问权限,允许任何类自由创建这个类的实例对象,但是某些时候,允许其他类自由创建这个类的对象没有任何意义,还可能造成了系统性能的下降。

 2.如果一个类始终只能创建一个实例,则这个类就被称为单例类,这个时候我们就应该把类的构造器用private修饰,从而把这个类的所有构造器隐藏起来。

【优点】

1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。


【缺点】

主要缺点:
1、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
2、单例类的职责过重,在一定程度上违背了“单一职责原则”。
3、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。


【分类运用及其优缺点】

------------

1.饿汉式

------------

    单例实例在类装载时就构建,急切初始化。(预先加载法)  --- 推荐
public class Singleton1 {
private Singleton1() {
}
public static Singleton1 instance = new Singleton1();
public Singleton1 getInstance() {
return instance;
}
}

优点:

   1.线程安全 .
   2.在类加载的同时已经创建好一个静态对象,调用时反应速度快.
缺点:

    资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化.
------------

2.懒汉式

-------------

    单例实例在第一次被使用时构建,延迟初始化。
class Singleton2 {
private Singleton2() {
}
public static Singleton2 instance = null;
public static Singleton2 getInstance() {
if (instance == null) {
              //多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况
instance = new Singleton2();
}
return instance;
}
}
懒汉式在单个线程中没有问题,但在多线程就可能会出现两个或多个Singleton2实例情况,
虽然后面实例化的Singleton2会覆盖前面实例化的Singleton2,但最好避免这样的情况。
改进方式就是加锁synchornized
class Singleton3 {
private Singleton3() {
}
public static Singleton3 instance = null;
public static synchronized Singleton3 getInstance() {
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
}
优点:

    资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法
缺点:

    第一次加载时不够快,多线程使用不必要的同步开销大

-----------------

3.双重检测

------------------
class Singleton4 {
private Singleton4() {
}
public static Singleton4 instance = null;
public static Singleton4 getInstance() {
if (instance == null) {
synchronized (Singleton4.class) {
if (instance == null) {
instance = new Singleton4();
}
}
}
return instance;
}
}
优点:

   资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法
缺点:

   第一次加载时反应不快,由于java内存模型一些原因偶尔失败


---------------------

4.静态内部类

---------------------
class Singleton5 {
private Singleton5() {
}
private static class SingletonHelp {
static Singleton5 instance = new Singleton5();
}
public static Singleton5 getInstance() {
return SingletonHelp.instance;
}
}
优点

   资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法
缺点

   第一次加载时反应不够快


【总结】

   一般采用饿汉式(1),若对资源十分在意可以采用静态内部类(4),不建议采用懒汉式及双重检测(2、3)















0 0
原创粉丝点击