上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(一)-CSDN博客
三、请描述单例模式(Singleton Pattern)及其使用场景。
单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在软件系统中非常常见,因为它提供了一种控制实例数量和确保全局一致性的有效方法。
单例模式的特点:
- 唯一性:确保一个类只有一个实例。
- 全局访问点:提供一种方式来访问这个唯一的实例。
- 延迟实例化:只有在需要时才创建实例,这有助于节省资源。
- 线程安全:在多线程环境中,确保实例的唯一性,即使多个线程同时尝试访问实例。
单例模式的实现步骤:
- 私有化构造函数:将类的构造函数设为私有,防止外部通过
new
关键字创建实例。 - 私有静态变量:在类内部创建一个私有静态变量来存储类的唯一实例。
- 公有静态方法:提供一个公有静态方法,用于获取这个唯一实例。如果实例不存在,该方法会创建实例并返回;如果已经存在,则直接返回现有实例。
单例模式的示例(Java语言):
public class Singleton {
// 私有静态变量,存储类的唯一实例
private static Singleton instance;
// 私有构造函数,防止外部通过new创建实例
private Singleton() {
}
// 公有静态方法,提供全局访问点
public static Singleton getInstance() {
if (instance == null) {
// 同步代码块,确保线程安全
synchronized (Singleton.class) {
// 再次检查实例是否为null,避免多线程环境下的竞态条件
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
使用场景:
- 配置管理器:在应用程序中,配置信息通常只需要一个实例,比如数据库连接信息、应用设置等。
- 连接池:数据库连接池需要限制数据库连接的数量,单例模式可以确保连接池的全局唯一性。
- 日志记录器:日志记录器通常在应用程序中只需要一个实例,用于记录日志信息。
- 硬件管理器:管理硬件设备的类,如打印机管理器,可能只需要一个实例来控制所有打印任务。
- 资源管理器:对于需要全局访问的资源,如文件系统管理器,使用单例模式可以确保资源的一致性和有效管理。
示例场景:
假设你正在开发一个桌面应用程序,该应用程序需要一个日志记录器来记录所有操作的日志。使用单例模式,你可以确保整个应用程序中只有一个日志记录器实例,所有组件都使用这个实例来记录日志。
public class Logger {
private static Logger instance;
private List<String> logMessages;
private Logger() {
logMessages = new ArrayList<>();
}
public static synchronized Logger getInstance() {
if (instance == null) {
instance = new Logger();
}
return instance;
}
public void log(String message) {
logMessages.add(message);
}
public List<String> getLogMessages() {
return logMessages;
}
}
在这个例子中,Logger
类使用单例模式来确保全局只有一个日志记录器实例。应用程序中的任何组件都可以通过调用Logger.getInstance()
来获取日志记录器实例,并使用它来记录日志。这样,所有的日志信息都存储在一个共享的列表中,便于管理和检索。
四、工厂模式(Factory Pattern)和抽象工厂模式(Abstract Factory Pattern)有什么区别?
工厂模式和抽象工厂模式都是创建型设计模式,它们用于创建对象,但它们之间存在一些关键的区别:
工厂模式(Factory Pattern)
- 定义:工厂模式定义了一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
- 目的:主要用于创建一个具体类的实例,这个具体类有多个参数或者创建过程比较复杂。
- 结构:包含一个工厂类(Factory Class)和一个或多个具体产品类(Concrete Product Classes)。
- 使用场景:当需要创建的对象是同一类的不同实例时使用,例如创建不同类型的汽车。
- 优点:隐藏了实例创建的细节,将对象创建和使用分离,提高了灵活性和可扩展性。
抽象工厂模式(Abstract Factory Pattern)
- 定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要指定它们具体的类。
- 目的:用于创建一系列相关的产品族,这些产品在结构上相互关联,例如创建具有不同风格的GUI组件。
- 结构:包含一个抽象工厂类(Abstract Factory Class),一个或多个具体工厂类(Concrete Factory Classes),以及一个或多个抽象产品类(Abstract Product Classes)和具体产品类(Concrete Product Classes)。
- 使用场景:当需要创建的产品族是相关联的,并且希望系统能够独立于具体产品类的设计变化时使用。
- 优点:提供了一种方式来保证客户端不依赖于具体的实现类,同时可以一起创建一组相关的产品。
区别总结:
- 创建对象的个数:工厂模式通常用于创建一个具体类的实例,而抽象工厂模式用于创建相关或依赖的对象族。
- 产品结构:工厂模式关注的是创建一个对象,而抽象工厂模式关注的是创建一个产品系列或产品组合。
- 复杂性:抽象工厂模式比工厂模式更复杂,因为它需要定义更多的接口和类。
- 使用场景:工厂模式适用于单一产品实例化的场景,而抽象工厂模式适用于需要同时创建多个相关或依赖产品的场景。
- 扩展性:抽象工厂模式在添加新的产品对象时更加灵活,因为它允许通过添加新的具体工厂来扩展新的产品族,而不需要修改已有的工厂类。
示例:
- 工厂模式示例:假设有一个汽车工厂,它可以根据客户的需求生产不同类型的汽车,如轿车、SUV等。每种类型的汽车都是一个具体产品。
- 抽象工厂模式示例:假设有一个汽车工厂,它不仅生产汽车,还生产汽车的配件,如轮胎、发动机等。这些产品在结构上是相互关联的,形成一个产品族。
通过这些区别,我们可以看出,选择使用工厂模式还是抽象工厂模式取决于具体的需求和设计目标。
标签:面试题,必问,创建,模式,工厂,instance,实例,日志,设计模式 From: https://blog.csdn.net/2401_84542969/article/details/139754918