python面向对象设计模式
设计模式
工厂方法
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类中
优点:
-
用户只要知道具体的工厂名称就可以得到所要的产品,无需知道产品的具体创建过程
-
在系统增加新的产品时 只需要添加具体产品类和对应的具体工厂类 无需对原工厂进行任何修改 满足开闭原则
缺点
每增加一个产品都要增加一个具体产品和对应工厂类 增加了系统复杂度
适用场景
- 客户只知道创建产品的工厂名 而不知道具体的产品名称
- 创建对象任务由多个具体子工厂中的某一个完成
- 客户不关心创建产品的细节 只关心产品的品牌
from abc import abstractmethod, ABC
# 工厂方法实现
class Product:"""抽象产品:定义了产品规范 描述了产品的主要特性和功能"""@abstractmethoddef show(self):passclass Hat(Product):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 同具体工厂之间一一对应帽子->帽子工厂"""def show(self):print("我是一个帽子!!!")class Scarf(Product):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 同具体工厂之间一一对应围巾->围巾工厂"""def show(self):print("我是一个围巾!!!")class AbstractFactory:"""抽象工厂: 提供创建产品的接口"""@abstractmethoddef new_product(self):passclass HatFactory(AbstractFactory):"""具体工厂: 实现抽象工厂抽象方法 完成具体产品的创建"""def new_product(self):return Hat()class ScarfFactory(AbstractFactory):"""具体工厂: 实现抽象工厂抽象方法 完成具体产品的创建"""def new_product(self):return Scarf()if __name__ == '__main__':HatFactory().new_product().show()ScarfFactory().new_product().show()
抽象工厂方法
抽象工厂模式:
是一种为访问类提供一个创建一组相关或相互依赖对象的接口
访问类无需指定所要产品的具体类就能得到同族不同等级的产品的模式结构
抽象工厂模式需要满足的条件:
1. 系统中有多个产品族(如品牌) 每个具体工厂创建同一族但属于不同等级(如不同产品类型)机构的产品2. 系统一次只可能消费其中某一组的产品
优点:
1. 工厂模式优点2. 可以在类的内部对产品族中相关联的多等级产品共同管理 而不必专门引入多个新类来进行管理3. 增加一个新的产品族时 不需要修改原代码 满足开闭原则
缺点:
当产品族这种需要增加一个新的产品时 所有的工厂类都要进行修改
模式应用场景
- 需要创建的对象是一系列相互关联或相互依赖的产品族时
- 系统中有多个产品族 但每一次只使用其中某一族的产品
- 系统中提供了产品的类库 并且所有产品的接口相同 客户端不依赖产品实例的创建细节和内部结构
from abc import abstractmethod
class Hat:"""抽象产品: 抽象产品:定义了产品规范 描述了产品的主要特性和功能"""@abstractmethoddef show(self):passclass Scarf:"""抽象产品: 定义了产品规范 描述了产品的主要特性和功能"""@abstractmethoddef show(self):passclass AdidasHat(Hat):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 但是是一对多关系"""def show(self):print("我是一个阿迪达斯帽子")class AdidasScarf(Scarf):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 但是是一对多关系"""def show(self):print("我是一个阿迪达斯围巾")class ErkeHat(Hat):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 但是是一对多关系"""def show(self):print("我是一个鸿星尔克帽子")class ErkeScarf(Scarf):"""具体产品: 实现了抽象产品角色所定义的接口 由具体工厂来创建 但是是一对多关系"""def show(self):print("我是一个鸿星尔克围巾")class AbstractFactory:"""抽象工厂: 提供创建产品的接口 具有多个创建产品的方法"""@abstractmethoddef new_product_hat(self):pass@abstractmethoddef new_product_scarf(self):passclass AdidasFactory(AbstractFactory):"""具体工厂: 实现抽象工厂抽象方法 完成具体产品的创建"""def new_product_hat(self):return AdidasHat()def new_product_scarf(self):return AdidasScarf()class ErkeFactory(AbstractFactory):"""具体工厂: 实现抽象工厂抽象方法 完成具体产品的创建"""def new_product_hat(self):return ErkeHat()def new_product_scarf(self):return ErkeScarf()if __name__ == '__main__':AdidasFactory().new_product_hat().show()AdidasFactory().new_product_scarf().show()ErkeFactory().new_product_hat().show()ErkeFactory().new_product_scarf().show()