单例模式
一、什么是单例模式
在Java的编程设计中,单例模式(Singleton Pattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
二、怎么实现单例模式
单例的实现主要是通过以下两个步骤:
- 将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
- 在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用。
主要标识:private
用private 修饰构造函数,在这个类以外无法主动创建这个类的对象,要通过专门定义的接口来进行定义。
三、单例模式的应用场景
举一个小例子,在一个班级中有一台打印机朗泰电脑,两个 同学同时使用带电脑进行打印,现在如果有多个对象在打印机中创建就会造成对象的错乱,造成bug的存在,所以在这里就要用到单例模式。
或者在我们的windows桌面上,我们打开了一个回收站,当我们试图再次打开一个新的回收站时,Windows系统并不会为你弹出一个新的回收站窗口。,也就是说在整个系统运行的过程中,系统只维护一个回收站的实例。这也是一个典型的单例模式运用。
四、经典单例模式
1.懒汉式
public class SingLeten {
//懒汉式 单例模式
//现为不安全,在多线程里面可能会重复调用,数据丢失
private static SingLeten s = null;
private String name;
private SingLeten(String a){
System.out.println("懒汉式");
this.name = a;
}
public static SingLeten getInstance(String a){
if(s == null)
s = new SingLeten(a);
return s;
}
public void P(){
System.out.println(this.name);
}
}
这里的懒汉式没有考虑多线程的情况,现为不安全
2.饿汉式
public class SingLeten1 {
//饿汉式,因为常创建的对象被定义为final常量
private static final SingLeten1 s = new SingLeten1();
private SingLeten1(){
System.out.println("饿汉式");
}
public static SingLeten1 getInstance(){//接口
return s;
}
}
饿汉式单例模式创建的对象用final修饰,所以不用考虑多线程,为安全
等…
四、单例模式的优缺点
优点
- 在内存中只有一个对象,节省内存空间;
- 避免频繁的创建销毁对象,可以提高性能;
- 避免对共享资源的多重占用,简化访问;
- 为整个系统提供一个全局访问点。
缺点
- 不适用于变化频繁的对象;
- 滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;
- 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;