【Java基础】单例模式
1.单例模式
设计模式:大量的实践总结和理论化之后最优的代码结构、编程风格、解决问题的思考方式。类似于棋谱、套路。
单例模式:在整个程序中,对某个类只能存在一个对象实例。比如windows系统中任务管理器窗口只能打开一个。
(1)对象通过构造器来创建,防止别的类使用new来创建该类对象,因此将构造器设为private。
private Singleton() {
}
(2)提供一个静态对象,防止其他人修改该对象为null等,权限为private。
private static SingleTon singleTon = new SingleTon();
(3)提供一个公共方法来访问该对象,让其他类只能通过类名.静态方法
调用(不是静态的只能通过对象调用,而此时没有对象)。
public static SingleTon getInstance(){
return singleTon;
}
2.饿汉式
singleTon对象使用static修饰,类加载时直接new SingleTon()
创建。
好处:线程安全。
坏处:对象加载时间过长。
public class Singleton {
private Singleton() {
}
private static Singleton singleton = new Singleton();
public static Singleton getInstance() {
return singleton;
}
}
和使用静态代码块的方式效果是一样的,都是类加载时创建。
private static Singleton singleton = null;
static {
singleton = new Singleton();
}
3.懒汉式
在调用getInstance()方法时,判断对象是否为空,才决定创建对象。
此方式存在线程不安全问题。
好处:延迟对象的创建。
坏处:此种方式线程不安全。
class Singleton {
private Singleton() {
}
private static Singleton singleton;
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
4.线程安全的懒汉式
双重检查
public class Bank {
private Bank(){ }
private static Bank instance = null;
public static Bank getInstance(){
if (instance==null){
synchronized (Bank.class){
if (instance==null){
instance = new Bank();
}
}
}
return instance;
}
}