如何建立互联网公司网站武当王也
2026/4/18 5:31:50 网站建设 项目流程
如何建立互联网公司网站,武当王也,自己搭建邮件服务器,wordpress 影视源码Day 67#xff1a;【99天精通Python】设计模式 (Design Patterns) 上篇 - 单例与工厂 前言 欢迎来到第67天#xff01; 写代码就像盖房子。初学者只要能把砖头砌起来#xff0c;房子不塌就行。但资深工程师追求的是结构优雅、易于维护、可扩展。 设计模式 (Design Patterns)…Day 67【99天精通Python】设计模式 (Design Patterns) 上篇 - 单例与工厂前言欢迎来到第67天写代码就像盖房子。初学者只要能把砖头砌起来房子不塌就行。但资深工程师追求的是结构优雅、易于维护、可扩展。设计模式 (Design Patterns)就是前人总结出来的建筑图纸。遇到什么问题套用什么模式往往能事半功倍。本节内容设计模式的三大分类单例模式 (Singleton)确保一个类只有一个实例工厂模式 (Factory)批量生产对象的工厂Pythonic 的实现方式一、设计模式分类通常分为三类创建型 (Creational)关注对象的创建过程如单例、工厂、建造者。结构型 (Structural)关注类和对象的组合如适配器、装饰器、代理。行为型 (Behavioral)关注对象之间的通信如观察者、策略、责任链。今天我们先攻克最常用的两个创建型模式。二、单例模式 (Singleton)场景一个系统只能有一个数据库连接池。全局的配置管理器 (Config Manager) 只能有一份。也就是无论你调用多少次类它返回的永远是同一个实例。2.1 传统实现使用__new____new__是 Python 中真正负责创建对象的方法比__init__更早执行。classSingleton:_instanceNone# 用于存储唯一实例def__new__(cls,*args,**kwargs):ifnotcls._instance:print(创建新的实例...)# 调用父类的 __new__ 创建实例cls._instancesuper().__new__(cls)returncls._instancedef__init__(self,name):self.namename# 测试s1Singleton(配置A)s2Singleton(配置B)print(s1iss2)# True (它们是同一个对象)print(s1.name)# 配置B (s2 初始化时覆盖了 s1 的属性)print(s2.name)# 配置B2.2 Pythonic 实现使用装饰器写一个装饰器把类包起来让它变成单例。defsingleton(cls):instances{}defwrapper(*args,**kwargs):ifclsnotininstances:instances[cls]cls(*args,**kwargs)returninstances[cls]returnwrappersingletonclassDatabase:def__init__(self):print(连接数据库...)db1Database()db2Database()# 不会再次打印 连接数据库...print(db1isdb2)# True2.3 最简单的实现模块 (Module)其实Python 的模块本身就是单例。因为 Python 导入模块时会缓存第二次导入直接从缓存拿。# config.pyclassConfig:passsettingsConfig()# main.py# from config import settings# 无论在哪里导入 settings它都是同一个对象。三、工厂模式 (Factory)场景你去买车你不需要知道车是怎么造出来的你只要告诉工厂我要一辆特斯拉工厂就给你一辆车。解耦将对象的创建和使用分离。3.1 简单工厂 (Simple Factory)一个工厂类根据参数决定生产什么产品。classDog:defspeak(self):return汪汪classCat:defspeak(self):return喵喵classAnimalFactory:staticmethoddefcreate_animal(animal_type):ifanimal_typedog:returnDog()elifanimal_typecat:returnCat()else:raiseValueError(未知动物类型)# 使用pet1AnimalFactory.create_animal(dog)print(pet1.speak())缺点如果新增一种动物如 Pig必须修改create_animal的源代码违反开闭原则。3.2 工厂方法 (Factory Method)定义一个创建对象的接口让子类决定实例化哪一个类。# 抽象工厂基类classFactory:defcreate(self):raiseNotImplementedError# 具体工厂classDogFactory(Factory):defcreate(self):returnDog()classCatFactory(Factory):defcreate(self):returnCat()# 使用dog_factoryDogFactory()petdog_factory.create()print(pet.speak())3.3 注册工厂 (Python 动态特性)利用 Python 的字典我们可以实现一个无需修改代码就能扩展的工厂。classPaymentFactory:_creators{}classmethoddefregister(cls,type_name,creator_cls):cls._creators[type_name]creator_clsclassmethoddefget_payment(cls,type_name):creatorcls._creators.get(type_name)ifnotcreator:raiseValueError(f不支持的支付方式:{type_name})returncreator()classAliPay:defpay(self):print(支付宝支付)classWeChatPay:defpay(self):print(微信支付)# 注册PaymentFactory.register(alipay,AliPay)PaymentFactory.register(wechat,WeChatPay)# 使用pPaymentFactory.get_payment(alipay)p.pay()四、实战练习日志记录器工厂结合单例和工厂模式设计一个日志系统。LoggerManager是单例。提供get_logger(type)方法根据类型返回FileLogger或ConsoleLogger。classConsoleLogger:deflog(self,msg):print(f[Console]{msg})classFileLogger:deflog(self,msg):print(f[File] 写入:{msg})# 单例装饰器defsingleton(cls):instances{}defwrapper(*args,**kwargs):ifclsnotininstances:instances[cls]cls(*args,**kwargs)returninstances[cls]returnwrappersingletonclassLoggerManager:defget_logger(self,log_type):iflog_typefile:returnFileLogger()else:returnConsoleLogger()# 测试m1LoggerManager()m2LoggerManager()print(f管理器单例检查:{m1ism2})# Truelogm1.get_logger(file)log.log(系统启动)五、小结设计模式单例 Singleton工厂 Factorynew方法装饰器实现模块导入 (最推荐)简单工厂 (if/else)工厂方法 (子类实现)注册模式 (字典映射)关键要点单例模式保证全局唯一。Python 中直接用模块导入是最简单的单例。工厂模式封装创建逻辑。如果逻辑简单不要过度设计直接用函数返回对象即可。设计模式的初衷是解耦但不要为了模式而模式Over-engineering。六、课后作业数据库连接池模拟实现一个ConnectionPool类使用单例模式保证全局只有一个池子。池子里最多有 5 个连接。格式转换工厂编写一个工厂根据输入文件的后缀名.json, .xml, .csv返回对应的解析器对象JsonParser,XmlParser…。思考题在 Day 19 学过的装饰器模式属于哪一类设计模式它的作用是什么下节预告Day 68设计模式 (Design Patterns) 下篇 - 观察者与策略- 如果说创建型模式是造房子那行为型模式就是房子里的电路系统。明天我们学习如何让对象之间优雅地通信。系列导航上一篇Day 66 - Python操作Kubernetes下一篇Day 68 - 设计模式下待更新

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询