设计模式简单介绍(java语言)– 单例模式
1. 概念
单例模式是一个比较简单的设计模式,其主要定义如下:
Ensure a class has only one instance, and provide a global point of access to it.
确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
单例模式通用类图:
简单来说单例模式的思想是:
私有化某类的构造器,通过方法给外部获取。
单例模式通用代码:
public class Singleton {
/**
* @说明:单例模式通用代码
*/
/*限制产生多个对象*/
private static final Singleton SINGLETON = new Singleton();
/*私有化构造方法*/
private Singleton(){
}
/*通过该方法获取实例对象*/
public static Singleton getSingleton (){
return SINGLETON;
}
/*类中的其他方法,尽量是static*/
public static void doSomething(){
}
/以下方法需要注意高并发情况下的线程安全问题/
/*
private static final Singleton SINGLETON = null;
private Singleton(){
}
public static Singleton getSingleton (){
if(SINGLETON == null)
SINGLETON = new Singleton();
return SINGLETON;
}
*/
}
2. 应用
2.1 优点:
由于只存在一个实例,减少内存开支。特别是一个对象需要频繁的创建,销毁时,并且创建或销毁的性能问题无法优化时,到单例模式优势明显。只生成一个实例减少性能开销。当一个对象产生需要较多资源的时候,比如读取配置,产生其他依赖对象是,则可以通过在应用启动时直接产生一个单例对象,然后用永久驻留内存的方式解决,注意java GC机制。单例模式可以避免对资源的多重占用,避免对同一个资源文件的同时写操作。还可以在系统设置全局的访问点,优化和共享内存访问,比如可以设计一个单例类,负责所有数据表的映射处理。
2.2 缺点:
单例模式一般没有接口,扩展困难,如果要扩展基本上只能修改原代码。
单例模式对测试不利。
2.3 应用场景:
在一个系统中,要求一个类有且只有一个对象,如:
要求生成唯一id的环境
整个项目需要一个共享访问点或共享数据的环境:web页面上的计数器
创建一个对象需要消耗资源过多的:访问io或数据库
类中存在大量静态常量和静态方法的环境
3. 扩展
需要产生固定数量对象的模式叫做有上限的多例模式,它是单例模式的一种扩展,采用有上限的多例模式,我们可以决定在内存中有多少个实例,方便系统进行扩展,修正单例模式可能存在的性能问题,提高系统的响应速度。(修改时注意线程安全)