1.单例(单态,原子)设计模式:
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
2.单例模式特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
3.单例实现步骤
要实现一个单例类,需要经过三个步骤:
1、私有化构造函数,目的是避免其它类可以创建这个类的对象;
2、在本类中创建唯一实例对象(因为构造函数私有化了,所以单例类的唯一实例对象只能在单例类里面创建;),使用一个私有静态的成员变量保存
3、对外提供一个公开的静态的函数供别人获取这个唯一实例对象
单例模式分为两种方式:
饿汉式:构造方法私有化,外部无法产生新的实例化对象,只能通过static方法取得实例化对象
class Hello {
private static Hello instance = new Hello();
private Hello() { } //私有化构造函数
public static Hello getInstance() {
return instance;
}
public void print() {
System.out.println("Hello World");
}
}
特点:在类加载的时候就会创建对象;
好处:类,只会加载一次,所以这种写法可以保证对象的唯一性;
弊端:因为类加载的时候就会创建对象,所以有的时候还不需要使用对象,就会创建对象,造成内存的浪费;
懒汉式:当第一次去使用Singleton对象的时候才会为其产生实例化对象的操作
class Singleton {
//声明变量
private static volatile Singleton singleton = null;
//私有化构造函数
private Singleton() { }
public static Singleton getInstance() {
// 还未实例化
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
public void print() {
System.out.println("Hello World");
}
}
特点:懒汉式再类加载的时候不创建对象,只有第一次调用获取函数时才创建对象;
好处:就可以避免出现内存浪费的问题;
弊端:再多线程环境下不能保证对象的唯一性;
并且要注意当多个线程并发执行 getInstance 方法时,懒汉式会存在线程安全问题,所以用到了 synchronized 来实现线程的同步,当一个线程获得锁的时候其他线程就只能在外等待其执行完毕。而饿汉式则不存在线程安全的问题。