一. 单例模式概述
单例模式(Singleton),也叫单子模式,是一种常用的设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候,整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,显然,这种方式简化了在复杂环境下的配置管理。
特别地,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。事实上,这些应用都或多或少具有资源管理器的功能。例如,每台计算机可以有若干个打印机,但只能有一个 Printer Spooler(单例) ,以避免两个打印作业同时输出到打印机中。再比如,每台计算机可以有若干通信端口,系统应当集中 (单例)管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
综上所述,单例模式就是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种方法。
二:饿汉式HungrySingLeton
懒汉:一个类只允许被创建1次对象
1:构造器私有化
2:初始化一个私有静态的对象
3:提供一个公开的静态的获取对象的方法
注意
1:对象产生的时间:类加载的时候就被创建了
优点:代码简单,安全性较高
缺点:创建对象时机过早,有可能会浪费内存空间
public class Demo {
public static void main(String[] args) {
Student stu1 = Student.newInstance();
Student stu2 = Student.newInstance();
Student stu3 = Student.newInstance();
System.out.println(stu1);
System.out.println(stu2);
System.out.println(stu3);
}
}
public class Student {
private static Student student = new Student();
public static Student newInstance(){
return student;
}
private Student(){
System.out.println("创建对象");
}
}
三: 懒汉式LazySingLeton
懒汉式:什么时候用什么时候创建对象
1:构造器私有化
2声明一个私有的静态的对象变量
3:提供一个公开的静态获取对象的方法
注意:创建时间恰当
注意:多线程的情况下,容易出现多个对象使用双重校验法
public class Demo {
public static void main(String[] args) {
Student stu1 = Student.newInstance();
Student stu2 = Student.newInstance();
Student stu3 = Student.newInstance();
System.out.println(stu1);
System.out.println(stu2);
System.out.println(stu3);
}
}
public class Student {
private static Student student;
public static Student newInstance(){
//提高效率,如果第一次创建对象成功,后面就不用进入同步当中,直接返回对象即可
if(student==null){
synchronized (Student.class) {
//如果是第一次调用方法,进入if,创建对象
if(student==null){
student = new Student();
}
}
}
return student;
}
private Student(){
}
}