首先了解下单件模式
有些对象我们只需要一个。单件模式没有全局变量的缺点:全局变量需要在一开始就创建,万一这个全局变量很耗资源,而又一直没有用到它,就很浪费,单件模式可以在需要的时候再创建。
package
public
//利用一个静态变量来记录Singleton类的唯一实例
private
//把构造函数声明为私有的,只有Singleton类内才可以调用构造器
private
//在代码的任何地方调用静态方法getInstance方法实例化对象,并返回这个实例
public
if(uniqueInstance
{
uniqueInstance
}
return
}
}
下面我们用单例模式来设计一个巧克力炉,如下:
package com.amaker.app;public class Chocolateboiler {
}
但这样的简单单件设计会在多线程的时候遇到问题,所以这里我们为这个函数加上了同步(不过同步一个方法可能使程序执行效率下降100倍?所以在不是频繁使用此方法的时候还行)。
上面的做法是延迟实例化,这里我们用“急切”创建单件实例。
2.事先创建单件实例
3.还有一种方法是用"双重检查加锁",在getInstance()中减少使用同步。
private volatile static Chocolateboiler uniqueInstance;
//不过因为JVM的实现,java1.4及之前的版本不支持这个技巧
//-----------------------------------------------------------------------------------------------------------------------------------------------------------
Android 的Framework中(Android TV系统,这里工厂菜单的添加使用了这种模式,Android原生代码中没这个代码)
//jb4.3-mstar-master\device\mstar\common\libraries\tv\java\com\mstar\android\tv\TvFactoryManager.java
public class TvFactoryManager {
private final static String TAG = "TvFactoryManager";
//定义了一个静态变量mInstance
static TvFactoryManager mInstance = null;
//定义了一个静态变量mService
private static ITvFactory mService = null;
//构造函数声明为私有的
private TvFactoryManager() {
}
public static TvFactoryManager getInstance() {
/* Double-checked locking */
if (mInstance == null) {
synchronized (TvFactoryManager.class) {
if (mInstance == null) {
mInstance = new TvFactoryManager();
}
}
}
return mInstance;
}
private static ITvFactory getService() {
if (mService != null) {
return mService;
}
mService = TvManager.getInstance().getTvFactory();
return mService;
}
}
这样在FactoryMenuManagerImpl中就可以获取并使用这个单例了。
public class FactoryMenuManagerImpl implements FactoryMenuManager {
private static TvFactoryManager factormanager;
public FactoryMenuManagerImpl() {
if(factormanager == null){
factormanager = TvFactoryManager.getInstance();
}
}
//FactorymenuManagerImpl的其他函数
.....
//
}