Android 设计模式之 单例模式 kankanStyle

来源:互联网 发布:淘宝运营年度计划 编辑:程序博客网 时间:2024/05/16 01:04

        起初对单例,没有深入理解,只是拿来即用。

        在开发中遇到一个bug,一个activity中有4个fragment,其中2个fragmnet中用到了viewpaer图片轮播,结果只有一个图片轮播自动播放。所以回头来单例。

        为了节约内存,我们必须控制对象产生的数量,因为对象new出来之后,既存在于生命周期中,置空之后,也不会马上释放内存。

        所以我们把一个对象,在同一时刻之产生一个,就大大减少了手机cpu的负载。

        单例 英文Singleton pattern。

       一个通用的例子,instance就是实例的意思。

Java单例模式例子:
public class SingletonClass{
  private static SingletonClass instance=null;
  public static SingletonClass getInstance(){
  if(instance==null){
  synchronized(SingletonClass.class){
  if(instance==null){
  instance = new SingletonClass();
  }
  }
  }
  return instance;
  }
  private SingletonClass(){ }
  }

Q&A
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
假如有一个"单例对象",而"客户甲"、"客户乙" 和"客户丙"是单例对象的三个客户对象。可以看到,所有的客户对象共享一个单例对象。而且从单例对象到自身的连接线可以看出,单例对象持有对自己的引用。

使用单例,我们需要    新建对象时候
用ClassA.getInstance();
而不用   new ClassA();

优点

一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。

缺点

一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。

看代码,新建了一个数据库的管理类,其中构造器,使用了单例,本代码使用了框架。
public class DBManager extends LDBManager {
private static final String KEY = "DBManager.java";
private LDBHelper db;
private static DBManager instance;

//mapplication是application的子类
private DBManager() {
db = MApplication.get().getDBHelper();
}
//这句在判断DBmanager是否是独立操作。
    public static synchronized DBManager get() {
if (instance == null) {
instance = new DBManager();
}
return instance;
//一个同步的单例对象,适合于sqlite
public static synchronized DBManager get() {
if (instance == null) {
instance = new DBManager();
}
return instance;
}

private static final String KEY = "DBManager.java";

private LDBHelper db;

private static DBManager instance;


private DBManager() {
db = MApplication.get().getDBHelper();
}
//大家看到,我的MAppication,也是单例模式。

//再来看在fragmetn中的使用。
public static final synchronized MainFragment newInstance(String strs) ;
MainFragment f = new MainFragment();
Bundle args = new Bundle();
args.putString(KEY, strs);
f.setArguments(args);
return f;
}
代码示例:
双重锁机制
namespace Singleton
  {
  public class Singleton
  {
  //定义一个私有的静态全局变量来保存该类的唯一实例
  private static Singleton singleton;
if (userEntity == null)
return false;

CarteEntity carteEntity = DBManager.get().queryCartById(entity.id + "",
userEntity.id);

//在数据库操作类中,常常用单例。
//定义一个只读静态对象
  //且这个对象是在程序运行时创建的
  private static readonly object syncObject = new object();
/// <summary>
  /// 构造函数必须是私有的
  /// 这样在外部便无法使用 new 来创建该类的实例
  /// </summary>
  private Singleton()
  {}
/// <summary>


 

0 0
原创粉丝点击