单例
单例设计模式,就是保证对象的实例只有一个,防止每个用这个对象的人都创建一个实例。
1、定义:
什么是单例模式呢,单例模式(Singleton)又叫单态模式,它出现目的是为了保证一个类在系统中只有一个实例,并提供一个访问它的全局访问点。从这点可以看出,单例模式的出现是为了可以保证系统中一个类只有一个实例而且该实例又易于外界访问,从而方便对实例个数的控制并节约系统资源而出现的解决方案。
2、使用场景:
1、有频繁实例化然后销毁的情况,也就是频繁的 new 对象,可以考虑单例模式;
2、创建对象时耗时过多或者耗资源过多,但又经常用到的对象;
3、频繁访问 IO 资源的对象,例如数据库连接池或访问本地文件;
单例模式是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。单例模式在以下场景中通常被使用:
-
资源共享: 当一个对象需要被系统的不同部分共享访问时,可以使用单例模式。例如,配置管理器、日志管理器等可以作为单例来确保全局的配置信息和日志记录。
-
工厂类: 在工厂类中,单例模式常被用于管理工厂的实例。这样可以确保在整个应用程序中只有一个工厂类的实例。
-
数据库连接池: 在需要频繁访问数据库的应用中,使用单例模式可以确保全局共享的数据库连接池。
-
线程池: 单例模式可以用于线程池的创建,确保在整个应用中只有一个线程池实例。
-
日志记录: 单例模式常被用于日志记录,确保在整个应用中只有一个日志记录器实例。
-
缓存管理: 当应用中需要缓存数据,且需要全局共享访问时,可以使用单例模式来管理缓存。
-
窗口管理: 在图形用户界面(GUI)应用中,单例模式可以用于管理应用程序的主窗口,确保只有一个主窗口实例存在。
-
身份验证对象: 当一个对象负责管理用户的身份验证信息时,单例模式可以用于确保全局唯一的身份验证对象。
总体来说,单例模式适用于那些希望确保在系统中只有一个实例存在,并提供一个全局访问点的情况。在这些场景中,单例模式能够提供一种简洁而有效的解决方案。然而,需要注意的是,过度使用单例模式可能导致全局状态的问题,因此在设计时需要慎重考虑。
3、编程:
私有化构造方法
提供对象返回方法,用static修饰
对象创建语句要是在外面,需要用 static final限定词
1、饿汉:类加载时就先把对象实例准备好。
public class SingleTon { private SingleTon(){} private static final Peopel peopel=new Peopel(); public static Peopel getInstance(){ return peopel; } }
2、懒汉:什么时候要对象,什么时候再去创建。但是要记得加判断,即,实例为空的时候才去创建,不为空就返回,不加判断就是多例了。
public class SingleTon { private static People people;
private SingleTon(){} public static People getInstance(){ if(peopel==null){ people=new People(); } return people; } }
3、多线程下的单例:线程安全
public class SingleTon { private volatile static People people; private SingleTon(){} public static People getInstance(){ if(peopel==null) { //孩子没产生,大家进去排队,抢着造人 synchronized (People.class) { if (peopel == null) { people = new People(); } } } //孩子产生了那就不用都排队了,就去要孩子就好了 return people; } }
public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() { } public static Singleton getUniqueInstance() { //先判断对象是否已经实例过,没有实例化过才进入加锁代码 if (uniqueInstance == null) { //类对象加锁 synchronized (Singleton.class) { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } }