Skip to content

约 2 分钟阅读

创建型模式 ​

创建型模式隔离对象创建中的变化:由谁选择实现、怎样组装合法参数、怎样复制模板,以及在哪个范围内复用实例。对象使用方因此可以依赖稳定契约,但创建层仍要处理配置、失败与生命周期。

创建型模式的选择与对象生命周期

用导出服务判断创建边界 ​

一个订单导出服务可能同时存在多种创建需求:根据格式创建渲染器,用参数构建导出任务,复制常用列模板,复用存储连接池。它们不是同一种问题,连接池昂贵也不意味着它必须是全进程唯一。

问题对应模式需要说明的边界
限定范围内共享同一实例单例类加载器、容器或进程;初始化安全不等于内部操作线程安全
稳定流程需要不同产品实现工厂方法哪个创建者覆盖工厂方法、谁选择创建者、谁关闭产品
相关产品要配套创建抽象工厂哪些产品必须兼容;接口本身不会阻止外部混装
可选参数多且有组合约束建造者必填、默认值、校验、可变字段复制
基于已有配置生成新对象原型可变字段独立、不可变值共享、业务身份重新生成

创建、查找与复用 ​

下面两行可能有相似名称,却有不同合同:

java
Renderer renderer = factory.createRenderer();
Parser parser = registry.getParser("csv");

工厂方法的返回值可以按约定新建或复用;名字不能替代合同。第二行通常是在注册表中查找已经存在的实例。若解析器带有请求状态,多线程复用它就可能串数据;注册表可以保存供应器,每次调用时创建请求私有实例,但这又需要明确销毁和资源归属。

只有“按类型选择”的静态方法常被称为简单工厂,注册表则负责类型查找。经典工厂方法强调由具体创建者覆盖创建操作,抽象工厂强调创建一组相关产品,不能仅按类名都叫 Factory 就视为同一种结构。

生命周期比隐藏 new 更重要 ​

创建连接池时,需要确定谁持有、容量多大、何时关闭;创建任务时,需要确定参数快照在何时冻结。把它们搬进工厂,只改变了代码位置,不会自动解决泄漏、并发与容量问题。

例如固定线程池的 Executors.newFixedThreadPool(16) 使用无界任务队列。线程数量固定并不代表系统内存有界;生产服务还需要根据负载选择有界队列、拒绝策略与停机等待,并由应用生命周期统一关闭。为了表达实例共享而直接暴露一个永不关闭的静态线程池,不是完整资源管理方案。

阅读与验证 ​

先从具体变化进入对应详细页;需要扩展一个产品时读工厂方法,需要整套兼容产品时读抽象工厂。建造者与原型都能减少重复初始化,但前者强调构建步骤和约束,后者强调已有对象的复制合同。

验收时不仅检查能否创建对象,还要检查未知类型、非法参数、并发访问、复制后修改、重复构建和资源关闭。若一个对象只有几个稳定参数,直接构造更容易维护。

别急,先让缓存热一下。