设计模式是人们为软件开发中相同表征的问题,抽象出的可重复利用的解决方案。在某种程度上,设计模式已经代表了一些特定情况的最佳实践,同时也起到了软件工程师之间沟通的“行话”的作用。理解和掌握典型的设计模式,有利于我们提高沟通、设计的效率和质量。

典型回答

大致按照模式的应用目标分类,设计模式可以分为创建型模式、结构型模式和行为型模式。

创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种

  • 工厂模式(Factory、Abstract Factory)
  • 单例模式(Singleton)
  • 构建器模式(Builder)
  • 原型模式(ProtoType)*

结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。常见的结构型模式包括

  • 桥接模式(Bridge)
  • 适配器模式(Adapter)
  • 装饰者模式(Decorator)
  • 代理模式(Proxy)
  • 组合模式(Composite)
  • 外观模式(Facade)
  • 享元模式(Flyweight)

行为型模式,是从类或对象之间交互、职责划分等角度总结的模式。比较常见的行为型模式有

  • 策略模式(Strategy)
  • 解释器模式(Interpreter)
  • 命令模式(Command)
  • 观察者模式(Observer)
  • 迭代器模式(Iterator)
  • 模板方法模式(Template Method)
  • 访问者模式(Visitor)

考点分析

InputStream 的装饰模式实践
image.png

单例模式:

  • 这里的 volatile 能够提供可见性,以及保证 getInstance 返回的是初始化完全的对象。
  • 在同步之前进行 null 检查,以尽量避免进入相对昂贵的同步块。
  • 直接在 class 级别进行同步,保证线程安全的类方法调用。

    1. public class Singleton {
    2. private static volatile Singleton singleton = null;
    3. private Singleton() {
    4. }
    5. public static Singleton getSingleton() {
    6. // 尽量避免重复进入同步块
    7. if (singleton == null) {
    8. // 同步.class,意味着对同步类方法调用
    9. synchronized (Singleton.class) {
    10. if (singleton == null) {
    11. singleton = new Singleton();
    12. }
    13. }
    14. }
    15. return singleton;
    16. }
    17. }
  1. public class Singleton {
  2. private Singleton(){}
  3. public static Singleton getSingleton(){
  4. return Holder.singleton;
  5. }
  6. private static class Holder {
  7. private static Singleton singleton = new Singleton();
  8. }
  9. }

Spring 等如何在 API 设计中使用设计模式

  • BeanFactory和ApplicationContext应用了工厂模式。
  • 在 Bean 的创建中,Spring 也为不同 scope 定义的对象,提供了单例和原型等模式实现。
  • AOP 领域则是使用了代理模式、装饰器模式、适配器模式等。
  • 各种事件监听器,是观察者模式的典型应用。
  • 类似 JdbcTemplate 等则是应用了模板模式。