复习设计模式时,很多同学会把二十多个英文名放进一张表里背。到了考场看到 Singleton 、 Adapter 、 Observer 、 Decorator 四个都眼熟,反而开始凭印象猜:名字像“单例”,是不是因为“全局访问”而算结构型?如果这一步靠记忆碎片,很容易把分丢在最基础的分类题上。
这题真正考的不是你能不能背出某个模式的定义,而是:看到模式名时,能否先判断它解决的是“对象怎么产生”“对象怎么拼起来”,还是“对象之间怎么协作”。把判断入口换对,四个选项不必逐个硬背。
真题直读
一句话结论:题干问“对象如何被创建”,优先在创建型模式中找; Singleton 负责控制实例的产生,因此选 A 。
题目:下列设计模式中,属于创建型模式的是( )。
选项:
答案: A
解析: GoF 的 23 种设计模式分为创建型、结构型和行为型三类。创建型共 5 种,关注对象如何创建,包括 Singleton 、 Factory Method 、 Abstract Factory 、 Builder 、 Prototype ;结构型共 7 种,关注对象组合,包括 Adapter 、 Bridge 、 Composite 、 Decorator 、 Facade 、 Flyweight 、 Proxy ;行为型共 11 种,关注对象交互,包括 Observer 、 Strategy 、 Command 、 Iterator 、 State 、 Template Method 等。 Singleton 用于确保一个类只有一个实例并提供全局访问点,属于创建型。
考点讲透
考场语言里,创建型不是“代码里写了 new 就叫创建型”,而是“这个模式专门规定对象怎样被创建、由谁创建、创建多少个”。 Singleton 的核心动作是限制一个类只能产生一个实例,并给外部一个统一访问入口;它直接处理的是实例数量与取得实例的方式,所以归到创建型。
本题的关键信号是“创建型”。先别被 Singleton 的“全局访问点”带偏:访问点只是让外部取得那一个实例的方式,决定类别的是它先控制了实例的创建和唯一性。反过来,若题干问的是既有对象如何适配、包装或组合,才要把注意力转向结构型。
遇到模式分类题,用三步即可压缩判断时间:
这里有个边界要卡住: Decorator 也可能在运行时“新增功能”,但它不是在规定对象如何诞生,而是在不改原对象接口的前提下,用包装对象扩展职责。因此“能创建一个包装对象”不等于创建型。
为什么容易错
B 的 Adapter 最容易被“改造”二字联想误导。它要解决的是两个既有接口不兼容的问题,把一个接口转换成客户期望的接口;这是接口适配,属于结构关系,不是决定实例怎样产生。这是典型的关键词联想错误:看到“转换”却没有问“转换的对象关系是什么”。
C 的 Observer 误导性来自“一个对象带动多个对象”。但它的主线是主题状态变化后通知多个观察者,考的是对象之间的消息依赖与协作流程,属于行为型。把“一个影响多个”理解成“创建多个”,就是把因果过程错当成对象产生过程。
D 的 Decorator 常被误选,是因为它看起来像给对象“加了一层”。这层确实是新对象,却服务于包装与职责叠加:在保持相同接口的情况下灵活扩展功能。它的考点是组合结构,不是实例控制,属于结构型。这是范围错配——只盯着“新建”,忽略了模式解决问题的主目标。
所以别把分类题做成英文名配对。每个选项先翻译成一句动词短语:限制实例、转换接口、通知观察者、包装职责;类别往往就出来了。
相关内容展开
这一题还能迁移到两个相邻陷阱。第一, Factory Method 、 Abstract Factory 、 Builder 、 Prototype 与 Singleton 都是创建型,但它们关注点不同:工厂把“由哪个具体类创建”交给工厂方法或工厂族;建造者把复杂对象按步骤装配;原型通过复制已有对象得到新对象;单例只强调“唯一实例”。下次题干出现“产品族”“分步骤构造”“复制对象”,不要机械选 Singleton ,要看它究竟在考哪一种创建决策。
第二, Adapter 与 Decorator 都常以“再包一层”的外观出现。判断时看外部接口是否改变:为了让原本不兼容的接口能被调用,是 Adapter ;接口保持不变、只是附加职责,是 Decorator 。再加一个对照: Observer 不包接口,而是建立通知关系。这样遇到陌生场景,也能从“创建、结构、行为”三条主线排除。
临考速记
把三类模式先记成三句问话:
本题四项可压成: Singleton 管“一个实例”; Adapter 管“接口能接上”; Observer 管“状态变化要通知”; Decorator 管“功能往外叠”。题干问创建,就先锁定第一句。
想把这种“先看主动作、再判类别”的反应练成考场习惯,可以到小欢软考练几道设计模式真题:每做完一题,都给正确项和干扰项各写一句“它到底在解决什么”。
点击卡片进入小程序练习