ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

设计模式中的“创建型模式”(Creational Patterns),共5种经典类型,用于处理对象的创建过程

设计模式中的“创建型模式”(Creational Patterns),共5种经典类型,用于处理对象的创建过程 设计模式中的“创建型模式”Creational Patterns共5种经典类型用于处理对象的创建过程以提高灵活性、可维护性和解耦性。以下是简要说明单例模式Singleton确保一个类只有一个实例并提供全局访问点。常用于配置管理、日志记录器、线程池等场景。工厂方法模式Factory Method定义创建对象的接口由子类决定实例化哪个类实现“延迟绑定”将对象创建逻辑委托给子类。抽象工厂模式Abstract Factory提供创建一系列相关或相互依赖对象的接口而无需指定具体类适用于产品族如不同操作系统的UI组件Button、Checkbox。建造者模式Builder将复杂对象的构建过程与其表示分离支持分步构造如构建HTTP请求、SQL查询、大型对象配置。适用于构造参数多、可选属性多的场景。原型模式Prototype通过复制现有对象原型来创建新对象避免重复初始化开销要求对象支持深拷贝/浅拷贝常用于资源密集型对象或动态配置对象。这些模式共同目标是封装对象创建逻辑降低系统对具体类的依赖符合“依赖倒置”和“开闭原则”。# 示例简单工厂非GoF标准但常用——演示创建型思想classProduct:passclassConcreteProductA(Product):def__str__(self):returnProduct AclassConcreteProductB(Product):def__str__(self):returnProduct BclassSimpleFactory:staticmethoddefcreate_product(type_name:str)-Product:iftype_nameA:returnConcreteProductA()eliftype_nameB:returnConcreteProductB()else:raiseValueError(Unknown product type)在多线程环境下单例模式的核心挑战是多个线程可能同时首次访问单例实例导致重复初始化创建多个实例从而破坏“唯一性”契约。因此必须确保实例化过程的原子性与可见性即一个线程创建完成后其他线程能立即看到已初始化的实例。以下是几种主流且线程安全的单例实现方式以Java为主兼顾Python对比说明✅1. 双重检查锁Double-Checked Locking, DCL——Java经典方案优点延迟加载 高效仅首次创建加锁关键点需用volatile修饰实例变量防止指令重排序JDK 5 才保证正确性publicclassSingleton{privatestaticvolatileSingletoninstance;// volatile 确保可见性与禁止重排privateSingleton(){}// 私有构造publicstaticSingletongetInstance(){if(instancenull){// 第一次检查无锁synchronized(Singleton.class){if(instancenull){// 第二次检查加锁后instancenewSingleton();// 此处可能发生重排序volatile阻止它}}}returninstance;}}⚠️ 注意若缺少volatileJVM 可能将new Singleton()拆分为「分配内存→设置引用→调用构造器」导致其他线程看到未初始化完成的对象DCL失效。✅2. 静态内部类Static Inner Class——推荐的懒汉式方案Java利用JVM类加载机制的线程安全性外部类加载时不加载内部类首次调用getInstance()时才触发内部类加载和静态字段初始化天然线程安全、无同步开销。publicclassSingleton{privateSingleton(){}privatestaticclassHolder{staticfinalSingletonINSTANCEnewSingleton();}publicstaticSingletongetInstance(){returnHolder.INSTANCE;// 触发Holder类加载 → 线程安全初始化}}✅ 优势懒加载、无锁、简洁、JVM级保障是Java中最优雅的单例写法之一。✅3. 枚举Enum——最简、最安全Java由JVM保证枚举类型的实例唯一性、线程安全、防反射/反序列化攻击且代码极简。publicenumSingleton{INSTANCE;publicvoiddoSomething(){/* ... */}}// 使用Singleton.INSTANCE.doSomething();✅ 优势天然防反射破坏Enum构造器被JVM私有封禁、防反序列化伪造、不可继承、线程安全❌ 缺点不支持延迟加载枚举类在首次主动使用时即初始化且扩展性受限无法继承、不能实现接口以外的复杂逻辑。✅4. Python 中的线程安全单例推荐方式Python 全局解释器锁GIL虽简化了部分并发问题但不能替代显式同步尤其在多线程可变状态场景。常用方案模块级单例最Pythonic利用模块导入机制的天然单例性.py文件即模块导入一次即全局唯一对象# singleton.pyclass_Singleton:def__init__(self):self.data[]instance_Singleton()# 模块级实例使用from singleton import instance—— 简单、安全、无需锁。装饰器 threading.Lock显式控制importthreadingdefsingleton(cls):instances{}lockthreading.Lock()defget_instance(*args,**kwargs):ifclsnotininstances:withlock:ifclsnotininstances:instances[cls]cls(*args,**kwargs)returninstances[cls]returnget_instancesingletonclassDatabaseConnection:pass__new__threading.Lock类内控制需谨慎处理__new__的并发调用与__init__重复执行问题 总结对比方式是否懒加载是否线程安全是否防反射/反序列化语言适用性双重检查锁DCL✅✅volatile❌Java推荐静态内部类✅✅JVM保障❌Java强烈推荐枚举❌类加载即初始化✅JVM保障✅最强防护Java最安全Python模块单例✅首次导入✅导入机制✅模块不可伪造Python首选
返回列表