一. 简介
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
二. 定义
Java中单例模式的定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
三. 应用场景
1:Windows的Task Manager(任务管理器),
2:windows的Recycle Bin(回收站),
3:应用程序的日志应用,
4:Web应用的配置对象的读取(配置文件是共享的资源),
5:数据库连接池(数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵 的,因为何用单例模式来维护,就可以大大降低这种损耗),
6:多线程的线程池(线程池要方便对池中的线程进行控制),
7:HttpApplication 也是单例的典型应用(所有的HttpModule都共享一个HttpApplication实例)
四. 应用场景总结
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
五. 要点
单例模式的要点:
1. 类只能有一个实例;
2. 必须自行创建这个实例;
3. 必须自行向整个系统提供这个实例。
实现步骤:
1. 单例模式的类只提供私有的构造函数;
2. 类定义中含有一个该类的静态私有对象;
3. 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
六.代码
(1)饿汉式
public class SingletonClass{
private SingletonClass(){ }
private static final SingletonClass singletonClass = new SingletonClass();
public static SingletonClass getSingletonclass() {
return singletonClass;
}
}
(2)懒汉式
public class SingletonClass{
private SingletonClass(){ }
private static SingletonClass singletonClass = null;
public static SingletonClass getSingletonclass() {
if(singletonClass==null){
singletonClass = new SingletonClass();
}
return singletonClass;
}
}
七.在多线程的情况下,线程安全
public class SingletonClass{
private SingletonClass(){ }
private static SingletonClass singletonClass = null;
public static SingletonClass getSingletonclass() {
if(singletonClass==null){
synchronized (SingletonClass.class) {
if(singletonClass==null){
singletonClass = new SingletonClass();
}
}
}
return singletonClass;
}
}
单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问。使用工厂方法来限制实例化过程。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义。
二. 定义
Java中单例模式的定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。
三. 应用场景
1:Windows的Task Manager(任务管理器),
2:windows的Recycle Bin(回收站),
3:应用程序的日志应用,
4:Web应用的配置对象的读取(配置文件是共享的资源),
5:数据库连接池(数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库连接所引起的效率损耗,这种效率上的损耗还是非常昂贵 的,因为何用单例模式来维护,就可以大大降低这种损耗),
6:多线程的线程池(线程池要方便对池中的线程进行控制),
7:HttpApplication 也是单例的典型应用(所有的HttpModule都共享一个HttpApplication实例)
四. 应用场景总结
(1)资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。
(2)控制资源的情况下,方便资源之间的互相通信。如线程池等。
五. 要点
单例模式的要点:
1. 类只能有一个实例;
2. 必须自行创建这个实例;
3. 必须自行向整个系统提供这个实例。
实现步骤:
1. 单例模式的类只提供私有的构造函数;
2. 类定义中含有一个该类的静态私有对象;
3. 该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
六.代码
(1)饿汉式
public class SingletonClass{
private SingletonClass(){ }
private static final SingletonClass singletonClass = new SingletonClass();
public static SingletonClass getSingletonclass() {
return singletonClass;
}
}
(2)懒汉式
public class SingletonClass{
private SingletonClass(){ }
private static SingletonClass singletonClass = null;
public static SingletonClass getSingletonclass() {
if(singletonClass==null){
singletonClass = new SingletonClass();
}
return singletonClass;
}
}
七.在多线程的情况下,线程安全
public class SingletonClass{
private SingletonClass(){ }
private static SingletonClass singletonClass = null;
public static SingletonClass getSingletonclass() {
if(singletonClass==null){
synchronized (SingletonClass.class) {
if(singletonClass==null){
singletonClass = new SingletonClass();
}
}
}
return singletonClass;
}
}