每天设计者模式-1:基础面试题

在面试中,设计模式相关的问题几乎是必考项,特别是涉及到架构设计、软件开发和嵌入式系统开发等岗位。掌握常见的设计模式及其应用,不仅有助于提升代码质量,还能在面试中表现出扎实的编程能力。今天,我们来探讨面试中高频出现的设计模式基础问题,并结合示例代码,帮助初学者更好地理解。


1. 设计模式基础

1.1 什么是设计模式?为什么要使用设计模式?

解答 :

设计模式是一套被实践证明可行的、可复用的编程解决方案,适用于特定场景下的软件设计问题。其主要目的是提高代码的可读性、扩展性和复用性。

核心作用:

  • 提高代码复用性:减少重复代码,提高开发效率。
  • 增强系统扩展性:便于后续维护和修改。
  • 提高代码可读性:降低耦合度,改善代码结构。

示例:

假设你需要创建一个日志记录器,在应用程序的多个部分都需要它。你可以使用单例模式来确保日志记录器的唯一性。

java 复制代码
public class Logger {
    private static Logger instance;
    private Logger() {}
    public static Logger getInstance() {
        if (instance == null) {
            instance = new Logger();
        }
        return instance;
    }
    public void log(String message) {
        System.out.println("Log: " + message);
    }
}

1.2 设计模式分为几类?各有哪些模式?

解答 :

设计模式通常分为三大类:

设计模式类别 常见模式
创建型模式 工厂方法、抽象工厂、单例、建造者、原型
结构型模式 适配器、桥接、组合、装饰器、外观、享元、代理
行为型模式 责任链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者

2. 经典创建型模式

2.1 你如何实现单例模式?有哪些方式?

解答 :

单例模式保证一个类只有一个实例,并提供一个全局访问点。

常见实现方式:

  1. 饿汉式(类加载时初始化)(线程安全,但可能浪费资源)
java 复制代码
public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}
  1. 懒汉式(需要时才创建,但存在线程安全问题)
java 复制代码
public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  1. 双重检查锁(DCL,推荐,线程安全)
java 复制代码
public class Singleton {
    private static volatile Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

2.2 工厂模式和抽象工厂模式有什么区别?

解答:

  • 工厂方法模式:定义一个用于创建对象的接口,由子类决定实例化哪种产品。
  • 抽象工厂模式:提供一组相关或依赖的对象的创建接口,避免指定具体的类。

示例代码:

java 复制代码
interface Product {
    void use();
}
class ProductA implements Product {
    public void use() { System.out.println("使用产品A"); }
}
class ProductB implements Product {
    public void use() { System.out.println("使用产品B"); }
}
abstract class Factory {
    abstract Product createProduct();
}
class FactoryA extends Factory {
    public Product createProduct() { return new ProductA(); }
}

3. 结构型模式

3.1 适配器模式和装饰器模式的区别?

解答:

  • 适配器模式(Adapter):将一个类的接口转换成客户期望的另一个接口。
  • 装饰器模式(Decorator):在不修改原类的情况下,动态地给对象添加额外的行为。

示例代码省略,完整代码将在后续文章提供。



4. 行为型模式

4.1 观察者模式和发布-订阅模式有什么区别?

解答:

  • 观察者模式(Observer) :对象间一对多的依赖关系,观察者直接订阅被观察者的更新。
  • 发布-订阅模式(Pub-Sub) :引入消息中间件 (如 Kafka、RabbitMQ),发布者和订阅者不直接联系,通过消息通道解耦。

示例代码省略,完整代码将在下一篇文章提供。


本篇文章介绍了设计模式的基础概念和常见面试题,并结合示例代码进行讲解。后续将深入探讨每种设计模式的应用,敬请关注!

相关推荐
bigbig_ben2 小时前
yearning安装docker
运维·docker·容器
日常筹谋记5 小时前
工业厂房 TPO 防水卷材:技术需求如何传导到配方层面?
运维·网络·html
昵称画5 小时前
交接班记录电子化:三班之间的信息不漏
开发语言·数据库·人工智能·低代码·php
迷途之人不知返5 小时前
【文件系统】-4-软硬连接
linux
老歌老听老掉牙5 小时前
WorkBuddy 如何接入 PrePoMax 的 MCP 服务器
服务器·ai·mcp
“AI国潮设计-小江”5 小时前
【AIGC实战】Python+SDXL批量生成“潮汕英歌舞不倒翁”IP | 角色一致性与多场景融合方案,附完整代码
开发语言·人工智能·python·prompt·aigc
传奇开心果编程5 小时前
【Rust入门练中学】第6课:结构体与方法
开发语言·rust·结构体·编程语言理论·结构体方法·编程通用语言
Linux_cy5 小时前
服务器管理工具哪个好用?我用了七八个
运维·服务器·javascript·python·ssh·面板·gmssh
MoRanzhi12036 小时前
第6篇(下)· 使用 PyQt5 实现 2048 高性能计算版:统一运行控制与跨模式安全交接
python·pyqt·进程管理·状态机·软件架构·并发控制·数据一致性