起初对单例,没有深入理解,只是拿来即用。
在开发中遇到一个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(){ }
}
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();
}
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,也是单例模式。
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;
}
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;
{
public class Singleton
{
//定义一个私有的静态全局变量来保存该类的唯一实例
private static Singleton singleton;
if (userEntity == null)
return false;
CarteEntity carteEntity = DBManager.get().queryCartById(entity.id + "",
userEntity.id);
return false;
CarteEntity carteEntity = DBManager.get().queryCartById(entity.id + "",
userEntity.id);
//在数据库操作类中,常常用单例。
//定义一个只读静态对象
//且这个对象是在程序运行时创建的
private static readonly object syncObject = new object();
//且这个对象是在程序运行时创建的
private static readonly object syncObject = new object();
/// <summary>
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
/// </summary>
private Singleton()
{}
/// 构造函数必须是私有的
/// 这样在外部便无法使用 new 来创建该类的实例
/// </summary>
private Singleton()
{}
/// <summary>