Java23种设计模式大合集:https://blog.csdn.net/mirror_w/article/category/8845914
一、入门概要
设计思想
单例模式是一种常用的软件设计模式,其定义是单例对象只允许一个对象存在。许多时候整个系统只需一个全局对像,这样有利于协调系统的整体行为。 比如说在一个服务器程序中,该服务器的程序的配置信息都存放在一个文件中,这些配置由单列对象统一读取 ,然后服务器中的其他进程对象访问这个单例对象获取所需要的配置信息,这种情况简化了复杂系统环境下的配置管理。
实现思路
单例模式要求能够返回一个对象引用(永远是同一个)和一个获得该实例的一个方法(必须是静态方法,通常使用getInstance这个名称)。单例模式的实现主要有两个步骤:1.将该类的构造方法定义为私有构造方法,这样其他对象就无法通过本类的构造方法来实例化对象,只能通过本类提供的其他静态方法来获取该类的实例化对象。2,该类内提供了提供了一个静态方法,当我们调用该方法时,如果该方法持有的类引用不为空就返回类引用,如果该类持有的引用为空就则创建该类的引用,并赋值给该类保持的引用。
注意事项
单例模式在多线程的应用场合下要小心使用。如果当唯一实例尚未创建,有两个或多个线程同时调用并检测到唯一实例为创建,那么两个线程都同时创建了实例,则这就违反了单例模式的实例唯一原则,解决该问题的方法就是提供给是否创建实例引用的变量一个互斥锁(虽然这样会降低效率)。
二、单例模式之懒汉式。
懒汉式模式,
主要思想是创建对象的时候我们无需提前创建好,当调用者开始调用的时候我们才开始进行创建。下面是具体的代码逻辑
public class LazySingleObj {
/*
* 赖汉模式
*/
// 声明对象 ---无需提前创建,当调用者调用时才创建
private static LazySingleObj lazySingleObj = null;
private LazySingleObj() {
try {
Thread.sleep(1000);
System.out.println("LazySingleObj.LazySingleObj(懒汉式模式对象创建了)");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 当调用着进行调用方法获取对象时,进行创建
public static LazySingleObj getLazySingleObj() {
// 进行双重检查
if (lazySingleObj == null) {
synchronized (LazySingleObj.class) {
if (lazySingleObj == null) {
lazySingleObj = new LazySingleObj();
}
}
}
return lazySingleObj;
}
}
注意:懒汉式模式种调用者进行调用的时候必须要进过双重检查,不是为了多此一举,而是更加严格地过检查两次调用。
三、单例模式之恶汉式
所谓饿汉式,和懒汉式不同,见名思意,不管调用者有没有调用对象,都会提前创建好一个对象,当对象被调用时,直接返回被创建的对象。
public class HungrySingleObj {
/*
* 饿汉式
*/
// 提前创建对象
private static HungrySingleObj hungrySingleObj = new HungrySingleObj();
private HungrySingleObj() {
try {
Thread.sleep(1000);
System.out.println("HungrySingleObj.HungrySingleObj(饿汉式模式对象创建了)");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 当调用者调用方法获取对象时直接返回对象
public static HungrySingleObj getHungrySingleObj() {
return hungrySingleObj;
}
}
四、单例模式的优缺点
优点
一、实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
二、灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
缺点
一、开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
二、可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
三、对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中,只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
大数据入门:https://blog.csdn.net/Mirror_w
Java23种设计模式大合集:https://blog.csdn.net/mirror_w/article/category/8845914