java 单例设计模式
概述:
像Windows系统的任务管理器一样,你无论打开多少次,始终显示的一个窗口。如何保证一个类只有一个实例并且这个实例易于被访问呢,定义一个统一的全局变量可以确保对象随时可以被访问,但不能防止创建多个对象。一个最好的办法就是让类自身负责创建和保存它的唯一实例,并保证不创建其他实例,它还提供了一个访问该实例的方法,这就是单例模式的动机。
单例模式适用场景
单例模式优缺点
优点:
- 提供了对唯一实例的受控访问。
- 在系统内存中只存在一个对象,因此可以节约系统的资源,对于一些需要频繁创建和销毁的对象,使用单例模式无疑是提高了系统的性能。
- 单例模式允许可变数目的实例。基于单例模式可以进行扩展,使用与控制单例对象相似的方法获得指定个数的实例对象,既节约了系统资源,又解决了由于单例对象共享过多有损性能的问题(自行提供指定数目实例对象的类可成为多例类)
缺点:
- 由于单例模式没有抽象层,所以扩展起来很难。
- 单例类职责过重,在一定程度上违背了单一职责。因为单例类既提供了业务方法,又提供了创建对象的方法(工厂方法),将对象的创建和对象本身的功能耦合在一起。
- 垃圾回收机制,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源。在下次利用时又将重新实例化,这将导致共享单例对象状态丢失。
实现思路
单例设计模式
- 1.构造方法私有化(防止外部直接new一个新对象)
- 2.声明一个本类的对象(静态的),(保证对象只有一个)
- 3.给外部提供一个静态方法获取对象实例
两种方法详解
代码大全:
public class Singleton {
public static void main(String[] args) {
// Singleton1 s = new Singleton1(); //构造方法私有化,不能直接new
Singleton2 s = Singleton2.instance(); //利用静态方法创建对象
s.print(); //输出 测试方法
Singleton2 s1 = Singleton2.instance();
s1.print(); //输出 测试方法
System.out.println(s1==s); //返回true 说明一共只有一个对象,及单例设计模式!!!
}
}
//饿汉式
class Singleton1{
private Singleton1(){} //构造方法私有化
static Singleton1 s = new Singleton1(); //声明一个本类的对象 ;饿汉式,太饿了,直接new对象
public static Singleton1 instance() { //给外部提供一个静态方法获取对象实例
return s;
}
public void print() { //测试方法
System.out.println("测试方法");
}
}
//懒汉式
//在多线程时 有一点小bug,下篇详解
class Singleton2{
private Singleton2(){} //构造方法私有化
static Singleton2 s; // 只是声明一下,没有创建对象
public static Singleton2 instance() { //给外部提供一个静态方法获取对象实例
if (s==null) {
s = new Singleton2(); //什么时候用到这个方法,再创建对象,生命周期较短
}
return s;
}
public void print() { //测试方法
System.out.println("测试方法");
}
}