单例模式介绍
本文主要内容为设计模式中的单例模式,单例模式的主要作用为保证一个类只有一个实例,并提供全局访问点
代码分析
简单实现
以下代码简单实现了一个单例模式的例子
/**
* 创建型模式-单例模式
*/
public class Singleton {
private static Singleton instance;
private Singleton() {
System.out.println("构造方法私有化");
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
在上面的示例中,Singleton类的构造函数是私有的,因此无法从外部实例化该类。 getInstance()方法返回单例实例,如果实例还不存在,则通过实例化创建新的实例。
结果分析
结果如下图所示,不能通过正常手段获取类对象
如果想要获取类对象,只能通过调用该类提供的内部方法,如下图
综上,通过构造方法的私有化可以简单的实现一个单例模式
对比分析
/**
* 创建型模式-单例模式
*/
public class Singleton {
private static Singleton instance;
private Singleton() {
System.out.println("构造方法私有化");
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
/**
* 正常创建
*/
class Example{
public Example(){
System.out.println("一般情况下构造方法");
}
}
/**
* 测试
*/
class Test{
public static void main(String[] args) {
//构造函数是私有的,因此无法从外部实例化该类,以下代码是错误的
// Singleton singleton=new Singleton();
//正确途径-通过调用该类提供的内部方法获取类对象
Singleton singleton1=Singleton.getInstance();
Singleton singleton2=Singleton.getInstance();
System.out.println(singleton2==singleton1);
System.out.println("---------分割线---------------");
//正常创建对象
Example example=new Example();
Example example2=new Example();
System.out.println(example2==example);
}
}
结果:
可以看到,单例模式下不仅结果返回为true,而且只运行了一次构造方法,即只进行了一次实例化,两次拿到的类对象都指向同一地址。
模式缺陷
需要注意的是,这种方式在多线程环境下可能会出现问题,因为当多个线程同时调用getInstance()方法时,可能会同时创建多个实例。为了解决这个问题,可以使用线程安全的实现方式,例如使用双重检查锁定或静态内部类等。