什么是单例模式?
只允许一个类存在一个实例。
什么时候使用?
单例模式就是为了减少重复的创建和销毁一个类的对象,所以当您想控制实例数目,节省系统资源的时候使用(如全局使用的类)。
单例的实现步骤:
1、将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
2、在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用;如果类保持的引用为空就创建该类的实例,并将实例的引用赋予该类保持的引用。
- 示例,创建一个SingleObject类:
public class SingleObject {
//创建 SingleObject 的一个对象
private static SingleObject instance = new SingleObject();
//让构造函数为 private,这样该类就不会被实例化
private SingleObject(){}
//获取唯一可用的对象
public static SingleObject getInstance(){
return instance;
}
public void showMessage(){
System.out.println("Hello World!");
}
}
从 singleton 类获取唯一的对象。
public class SingletonPatternDemo {
public static void main(String[] args) {
//不合法的构造函数
//编译时错误:构造函数 SingleObject() 是不可见的
//SingleObject object = new SingleObject();
//获取唯一可用的对象
SingleObject object = SingleObject.getInstance();
//显示消息
object.showMessage();
}
}
网上百度单例模式存在不同的实现方式,大概分别有如下几种:
1、懒汉模式:线程不安全,延迟初始化。
2、饿汉模式:线程安全。优点:没有加锁,执行效率会提高。缺点:类加载时就初始化,浪费内存。
3、双重锁模式:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
4、静态内部类单例模式:这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
5、枚举:这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法
网友评论