设计模式笔记--单例模式

来源:互联网 发布:办公室网络架构 编辑:程序博客网 时间:2024/06/06 09:32

常用设计模式有23中,分为:

创建型模式(主要用于创建对象)

1、单例模式    2、工厂方法模式    3、抽象工厂模式    4、建造者模式     5、原型模式 
行为型模式 (主要用于描述对象或类是怎样交互和怎样分配职责)

1、模板方法模式  2、中介者模式  3、命令模式    4、责任链模式   5、策略模式   6、迭代器模式  

7、观察者模式      8、备忘录模式   9、访问者模式   10、状态模式  11、解释器模式

结构型模式(主要用于处理类或对象的组合)

1、代理模式  2、装饰模式   3、适配器模式   4、组合模式   5、外观模式(门面模式)   6、享元模式   7、桥梁模式


单例模式 


单例模式(Singleton Pattern)是一个比较简单的模式,其定义如下:

 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。    




Singleton类称为单例类,通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化的(在Singleton中自己使用new Singleton())。  

单例模式通用代码 : 
public class Singleton {
private static final Singleton singleton = new Singleton();
//限制产生多个对象
private Singleton(){
}
//通过该方法获得实例对象
public static Singleton getSingleton(){
return singleton;
}
//类中其他方法,尽量是static
public static void doSomething(){
}
}


单例模式的使用场景

在一个系统中,要求一个类有且仅有一个对象,如果出现多个对象就会出现“不良反”,可以采用单例模式.
具体的场景如下:

● 要求生成唯一序列号的环境;

● 在整个项目中需要一个共享访问点或共享数据,例如一个Web页面上的计数器,使用单例模式保持计数器的值,并确保是线程安全的;

● 创建一个对象需要消耗的资源过多,如要访问IO和数据库等资源;

● 需要定义大量的静态常量和静态方法(如工具类)的环境,可以采用单例模式(当然,也可以直接声明为static的方式)。  

注意事项  


首先,在高并发情况下,请注意单例模式的线程同步问题 

其次,需要考虑对象的复制情况 ( 单例类不要实现Cloneable接口  )

有上限的多例模式

需要产生固定数量对象的模式就叫做有上限的多例模式,它是单例模式的一种扩展.

采用有上限的多例模式,我们可以在设计时决定在内存中有多少个实例,方便系统进行扩展,修正单例可能存在的性能问题,提供系统的响应速度。例如读取文件,我们可以在系统启动时完成初始化工作,在内存中启动固定数量的reader实例,然后在需要读取文件时就可以快速响应。  


Android中的单例:

public final class InputMethodManager {    static final Object mInstanceSync = new Object();//同步    //内部全局唯一实例    static InputMethodManager mInstance;     //对外api    static public InputMethodManager getInstance(Context context) {        return getInstance(context.getMainLooper());    }         /**     * 内部api,供上面的外部api调用     * @hide 系统隐藏的api     */    static public InputMethodManager getInstance(Looper mainLooper) {        synchronized (mInstanceSync) {            if (mInstance != null) {                return mInstance;            }            IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);            IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);            mInstance = new InputMethodManager(service, mainLooper);        }        return mInstance;    }}

注意:这段代码中getInstance方法中使用了synchronized关键字, 用来解决线程不安全问题,

有的书上把示例中增加了synchronized的单例称为懒汉式单例,把通用代码中没有使用synchronized的方法叫做饿汉式单例。建议在实际使用中使用饿汉式单例模式。



0 0
原创粉丝点击