首页 > 其他分享 >持续总结中!2024年面试必问 20 道设计模式面试题(二)

持续总结中!2024年面试必问 20 道设计模式面试题(二)

时间:2024-06-17 21:33:01浏览次数:15  
标签:面试题 必问 创建 模式 工厂 instance 实例 日志 设计模式

上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(一)-CSDN博客

三、请描述单例模式(Singleton Pattern)及其使用场景。

单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在软件系统中非常常见,因为它提供了一种控制实例数量和确保全局一致性的有效方法。

单例模式的特点:

  1. 唯一性:确保一个类只有一个实例。
  2. 全局访问点:提供一种方式来访问这个唯一的实例。
  3. 延迟实例化:只有在需要时才创建实例,这有助于节省资源。
  4. 线程安全:在多线程环境中,确保实例的唯一性,即使多个线程同时尝试访问实例。

单例模式的实现步骤:

  1. 私有化构造函数:将类的构造函数设为私有,防止外部通过new关键字创建实例。
  2. 私有静态变量:在类内部创建一个私有静态变量来存储类的唯一实例。
  3. 公有静态方法:提供一个公有静态方法,用于获取这个唯一实例。如果实例不存在,该方法会创建实例并返回;如果已经存在,则直接返回现有实例。

单例模式的示例(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;
    }
}

使用场景:

  1. 配置管理器:在应用程序中,配置信息通常只需要一个实例,比如数据库连接信息、应用设置等。
  2. 连接池:数据库连接池需要限制数据库连接的数量,单例模式可以确保连接池的全局唯一性。
  3. 日志记录器:日志记录器通常在应用程序中只需要一个实例,用于记录日志信息。
  4. 硬件管理器:管理硬件设备的类,如打印机管理器,可能只需要一个实例来控制所有打印任务。
  5. 资源管理器:对于需要全局访问的资源,如文件系统管理器,使用单例模式可以确保资源的一致性和有效管理。

示例场景:

假设你正在开发一个桌面应用程序,该应用程序需要一个日志记录器来记录所有操作的日志。使用单例模式,你可以确保整个应用程序中只有一个日志记录器实例,所有组件都使用这个实例来记录日志。

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)

  1. 定义:工厂模式定义了一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
  2. 目的:主要用于创建一个具体类的实例,这个具体类有多个参数或者创建过程比较复杂。
  3. 结构:包含一个工厂类(Factory Class)和一个或多个具体产品类(Concrete Product Classes)。
  4. 使用场景:当需要创建的对象是同一类的不同实例时使用,例如创建不同类型的汽车。
  5. 优点:隐藏了实例创建的细节,将对象创建和使用分离,提高了灵活性和可扩展性。

抽象工厂模式(Abstract Factory Pattern)

  1. 定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要指定它们具体的类。
  2. 目的:用于创建一系列相关的产品族,这些产品在结构上相互关联,例如创建具有不同风格的GUI组件。
  3. 结构:包含一个抽象工厂类(Abstract Factory Class),一个或多个具体工厂类(Concrete Factory Classes),以及一个或多个抽象产品类(Abstract Product Classes)和具体产品类(Concrete Product Classes)。
  4. 使用场景:当需要创建的产品族是相关联的,并且希望系统能够独立于具体产品类的设计变化时使用。
  5. 优点:提供了一种方式来保证客户端不依赖于具体的实现类,同时可以一起创建一组相关的产品。

区别总结:

  • 创建对象的个数:工厂模式通常用于创建一个具体类的实例,而抽象工厂模式用于创建相关或依赖的对象族。
  • 产品结构:工厂模式关注的是创建一个对象,而抽象工厂模式关注的是创建一个产品系列或产品组合。
  • 复杂性:抽象工厂模式比工厂模式更复杂,因为它需要定义更多的接口和类。
  • 使用场景:工厂模式适用于单一产品实例化的场景,而抽象工厂模式适用于需要同时创建多个相关或依赖产品的场景。
  • 扩展性:抽象工厂模式在添加新的产品对象时更加灵活,因为它允许通过添加新的具体工厂来扩展新的产品族,而不需要修改已有的工厂类。

示例:

  • 工厂模式示例:假设有一个汽车工厂,它可以根据客户的需求生产不同类型的汽车,如轿车、SUV等。每种类型的汽车都是一个具体产品。
  • 抽象工厂模式示例:假设有一个汽车工厂,它不仅生产汽车,还生产汽车的配件,如轮胎、发动机等。这些产品在结构上是相互关联的,形成一个产品族。

通过这些区别,我们可以看出,选择使用工厂模式还是抽象工厂模式取决于具体的需求和设计目标。

标签:面试题,必问,创建,模式,工厂,instance,实例,日志,设计模式
From: https://blog.csdn.net/2401_84542969/article/details/139754918

相关文章

  • spring面试题
    Spring框架中都用到了哪些设计模式?工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;单例模式:Bean默认为单例模式。代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;模板方法:用来解决代码重复的问题。比如.RestTemplate,JmsTemplate,JpaTemp......
  • OO设计模式中的工厂模式
    读书笔记:New具体类实例即为针对实现编程,因为因此而在代码中具体化了一个类,将来会有可能带来修改,而如果针对接口编程,即在代码中用抽象类代替具体类,则不易于引起修改。简单工厂:严格来说不是设计模式,只是编程良好规范,将易于变化的部分抽取出来封装。工厂方法:定义了创建对象的框......
  • Java常见面试题分享-用Java实现LIS(最长递增子序列)算法
    问题描述编写一个函数,该函数接受一个整数列表作为参数,计算这个列表的最长递增子序列(LIS)的长度,这个也是动态规划中常见的问题。举一个典型的场景:用来查找股票价格的最大增长,比如股票价格是[12,13,11,14,15,16,10,9,8,7],股票价格的最大增长是[12,13,14,15,......
  • 后端面试题分享-密码强度检查器
    问题描述编写一个函数,该函数接受一个字符串作为参数,检查该字符串是否符合密码强度要求,返回True或False。要求密码强度要求如下:不能小于6个字符必须出现大写、小写、数字、特殊字符(!@#$%^&*_-)的组合不能出现4个连续的字符,比如1234,dcba这样的规则建议使用正则表达式来......
  • c/c++设计模式--备忘录模式
    #include<iostream>#include<vector>#ifdef_DEBUG//只在Debug(调试)模式下#ifndefDEBUG_NEW#defineDEBUG_NEWnew(_NORMAL_BLOCK,__FILE__,__LINE__)//重新定义new运算符#definenewDEBUG_NEW#endif#endif//#include<boost/type_index.hpp>usingna......
  • Flink面试必问题:时间和窗口处理面试题及参考答案(3万字长文)
    目录Flink中的事件时间(EventTime)和处理时间(ProcessingTime)有什么区别?Flink的容错机制是如何实现的?Flink中的窗口(Window)是什么?Flink支持哪些类型的窗口?如何定义一个滚动窗口(TumblingWindow)?如何定义一个滑动窗口(SlidingWindow)?如何定义一个会话窗口(SessionWindow)?Flin......
  • MySql 常用面试题 (一)
    MySQL面试题及答案整理1.MySQL中有哪几种锁?MySQL中有多种锁类型,它们可以根据不同的分类标准进行划分。以下是一些主要的锁类型:按粒度分:表锁:每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。常用于整表数据迁移的场景。行锁:对......
  • 大模型算法岗 100 道面试题(含答案)
    节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。汇总合集:《大模型面试宝典》(2024版)发......
  • 设计模式-门面模式
    门面模式门面模式(FacadePattern),又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其重要特征时定义了一个高层接口,让子系统更容易使用,属于结构型模式门面模式,静态模式,委派模式门面模式就是特殊的静态代理模式门面模式重点在于封装,静态代理重点在于增强。委......
  • 设计模式-模板方法模式
    模板方法模式模板方法模式(TemplateMethodPattern),又叫模板模式,是指定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的默写特定步骤,属于行为型设计模式。模板方法的本质是抽象封装流程,该流程由几个步骤组成,具体步骤可......