• 设计模式-创建型模式(单例、工厂、建造、原型)


    Concept-概念前置

    设计模式:软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。

    面向对象三大特性:封装、继承、多态。

    面向对象设计的SOLID原则:
    (1)开放封闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。

    (2)里氏替换原则:所有引用父类的地方必须能透明地使用其子类的对象。

    (3)依赖倒置原则:高层模块不应该依赖低层模块,二者都应该依赖其抽象; 抽象不应该依赖细节;细节应该依赖抽象。

    (4)接囗隔离原则:使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。
    (5)单一职责原则:不要存在多于一个导致类变更的原因,即一个类只负责一项职责。
     

    举个例子,可能有不止一块代码调用到该实体,这时候去修改实体里的代码,就很可能引起其他模块会出现问题,当模块关联较多时就会引起不必要的工作量,这是1;

    原方法支持父类,当我们在基础上加或修改功能而衍生的子类也应当符合,这是2;

    要针对接口编程, 而不是针对实现编程,实现上也就是对底层的依赖按接口格式去写,再实现,而不是随意修改参数格式,即3。

    创建型模式

    简单工厂模式,工厂方法模式,抽象工厂模式,创建者模式,原型模式,单例模式。

    创建型模式(Creational Pattern)一种用于 创建对象 的设计模式。它们包含一些通用的方法,更加灵活地创建对象,且 封装 了对象的实例化过程
    工厂模式(Factory Pattern)

    用于根据 客户端需求动态创建 对象。

    (包括简单工厂模式,工厂方法模式,抽象工厂模式)

    单例模式(Singleton Pattern)

    用于确保一个类 只有一个 实例,并提供对该实例的全局访问点。它通常被用于管理共享资源或者限制系统中某些类的实例数量。

    建造者模式(Builder Pattern)

    用于将一个复杂对象的 构建过程分离 成多个简单的步骤,从而可以灵活地组合和构建不同的对象。它通常被用于创建复杂的对象,比如包含多个组件或者配置项的对象。

    原型模式(Prototype Pattern)用于 复制或克隆 已有的对象,从而创建新的对象。它通过克隆现有对象来创建新对象,从而避免了昂贵的初始化操作。

    工厂模式

    Factory Pattern

    简单工厂模式(Simple Factory Pattern):简单工厂模式是一种基本的工厂模式,通常由一个工厂类根据传入的参数动态决定创建哪种产品类的实例。(简单而言:一个工厂类根据传入参数创建哪个类实例)
    
    场景:适用于对象较少且产品等级结构稳定的情况。 
    
    Characters: 工厂角色(Factory) 抽象产品角色(Product) 具体产品角色(Concrete Product)
    
    1. class Product:
    2. def use(self):
    3. pass
    4. class ConcreteProductA(Product):
    5. def use(self):
    6. print("Using product A.")
    7. class ConcreteProductB(Product):
    8. def use(self):
    9. print("Using product B.")
    10. class Factory:
    11. @staticmethod
    12. def create_product(product_type):
    13. if product_type == "A":
    14. return ConcreteProductA()
    15. elif product_type == "B":
    16. return ConcreteProductB()
    17. product_a = Factory.create_product("A")
    18. product_a.use() # 输出:Using product A.
    19. product_b = Factory.create_product("B")
    20. product_b.use() # 输出:Using product B.
    工厂方法模式(Factory Method Pattern):将实际创建对象的工作推迟到子类中完成。可以在不修改工厂类的情况下,增加新的产品系列和产品等级结构。(简单而言:工厂类抽象化,将增改操作下发给子类)
    
    场景: 工厂方法模式适用于对象数量较多且产品等级结构较为复杂的情况。
    
    Characters: 工厂角色(Factory) 具体工厂角色(Concrete Factory) 抽象产品角色(Product) 具体产品角色(Concrete Product)
    1. class Product:
    2. def use(self):
    3. pass
    4. class ConcreteProductA(Product):
    5. def use(self):
    6. print("Using product A.")
    7. class ConcreteProductB(Product):
    8. def use(self):
    9. print("Using product B.")
    10. class Factory:
    11. def create_product(self):
    12. pass
    13. class ConcreteFactoryA(Factory):
    14. def create_product(self):
    15. return ConcreteProductA()
    16. class ConcreteFactoryB(Factory):
    17. def create_product(self):
    18. return ConcreteProductB()
    19. factory_a = ConcreteFactoryA()
    20. product_a = factory_a.create_product()
    21. product_a.use() # 输出:Using product A.
    22. factory_b = ConcreteFactoryB()
    23. product_b = factory_b.create_product()
    24. product_b.use() # 输出:Using product B.

    抽象工厂模式(Abstract Factory Pattern):是一种将工厂类进行抽象化的进一步改进,它使用了对象组合的方式来构建不同的产品族。(工厂抽象化,组合各种产品,有点像工厂方法模式的不同类方法组合)

    场景: 抽象工厂模式可以同时创建多个不同的产品,且这些产品之间存在着一定的关联性。

    Characters: 工厂角色(Factory) 具体工厂角色(Concrete Factory) 抽象产品角色(Product) 具体产品角色(Concrete Product) 客户端(Client)

    1. class ProductA:
    2. def use(self):
    3. pass
    4. class ConcreteProductA1(ProductA):
    5. def use(self):
    6. print("Using product A1.")
    7. class ConcreteProductA2(ProductA):
    8. def use(self):
    9. print("Using product A2.")
    10. class ProductB:
    11. def operate(self):
    12. pass
    13. class ConcreteProductB1(ProductB):
    14. def operate(self):
    15. print("Operating product B1.")
    16. class ConcreteProductB2(ProductB):
    17. def operate(self):
    18. print("Operating product B2.")
    19. class Factory:
    20. def create_product_a(self):
    21. pass
    22. def create_product_b(self):
    23. pass
    24. class ConcreteFactory1(Factory):
    25. def create_product_a(self):
    26. return ConcreteProductA1()
    27. def create_product_b(self):
    28. return ConcreteProductB1()
    29. class ConcreteFactory2(Factory):
    30. def create_product_a(self):
    31. return ConcreteProductA2()
    32. def create_product_b(self):
    33. return ConcreteProductB2()
    34. factory_1 = ConcreteFactory1()
    35. product_a1 = factory_1.create_product_a()
    36. product_a1.use() # 输出:Using product A1.
    37. product_b1 = factory_1.create_product_b()
    38. product_b1.operate() # 输出:Operating product B1.
    39. factory_2 = ConcreteFactory2()
    40. product_a2 = factory_2.create_product_a()
    41. product_a2.use() # 输出:Using product A2.
    42. product_b2 = factory_2.create_product_b()
    43. product_b2.operate() # 输出:Operating product B2.


    单例模式

    Singleton Pattern

    保证一个类仅有一个实例,并提供访问该实例的全局访问点。
    1. class Singleton:
    2. __instance = None
    3. def __new__(cls):
    4. if cls.__instance is None:
    5. cls.__instance = object.__new__(cls)
    6. return cls.__instance
    7. s1 = Singleton()
    8. s2 = Singleton()
    9. print(s1 is s2) # 输出:True =》 说明唯一性

    建造者模式

    Builder Pattern

    将一个复杂对象的构建过程分离成多个简单的步骤
    场景: 灵活地组合和构建不同的对象。
    
    Characters:
        产品类(Product) 抽象建造者类(Builder)
        具体建造者类(ConcreteBuilder) 指挥者类(Director)
    1. class Product:
    2. def __init__(self):
    3. self.part_a = None
    4. self.part_b = None
    5. class Builder:
    6. def build_part_a(self):
    7. pass
    8. def build_part_b(self):
    9. pass
    10. def get_result(self):
    11. pass
    12. class ConcreteBuilder1(Builder):
    13. def __init__(self):
    14. self.product = Product()
    15. def build_part_a(self):
    16. self.product.part_a = "Part A1"
    17. def build_part_b(self):
    18. self.product.part_b = "Part B1"
    19. def get_result(self):
    20. return self.product
    21. class ConcreteBuilder2(Builder):
    22. def __init__(self):
    23. self.product = Product()
    24. def build_part_a(self):
    25. self.product.part_a = "Part A2"
    26. def build_part_b(self):
    27. self.product.part_b = "Part B2"
    28. def get_result(self):
    29. return self.product
    30. class Director:
    31. def __init__(self, builder):
    32. self.builder = builder
    33. def construct(self):
    34. self.builder.build_part_a()
    35. self.builder.build_part_b()
    36. return self.builder.get_result()
    37. builder_1 = ConcreteBuilder1()
    38. director_1 = Director(builder_1)
    39. product_1 = director_1.construct()
    40. print(f"Product 1: {product_1.part_a}, {product_1.part_b}") # 输出:Product 1: Part A1, Part B1
    41. builder_2 = ConcreteBuilder2()
    42. director_2 = Director(builder_2)
    43. product_2 = director_2.construct()
    44. print(f"Product 2: {product_2.part_a}, {product_2.part_b}") # 输出:Product 2: Part A2, Part B2

    原型模式

    Prototype Pattern

    允许通过复制现有对象来创建新的对象,而无需重新实例化。
    
    Think: 定义一个抽象原型类,包含了用于复制自身的抽象方法 clone()。然后,定义具体的原型类。在客户端代码中,可以通过调用具体对象 clone() 方法来创建新的对象,而无需重新实例化。(注意深浅拷贝问题)
    1. import copy
    2. class Prototype:
    3. def clone(self):
    4. return copy.deepcopy(self)
    5. class ConcretePrototype1(Prototype):
    6. def __init__(self, attr):
    7. self.attr = attr
    8. class ConcretePrototype2(Prototype):
    9. def __init__(self, attr):
    10. self.attr = attr
    11. if __name__ == '__main__':
    12. prototype_1 = ConcretePrototype1("attr_1")
    13. prototype_2 = ConcretePrototype2("attr_2")
    14. clone_1 = prototype_1.clone()
    15. clone_2 = prototype_2.clone()
    16. print(f"Original: ({prototype_1.attr}, {prototype_2.attr})") # 输出:Original: (attr_1, attr_2)
    17. print(f"Clone: ({clone_1.attr}, {clone_2.attr})") # 输出:Clone: (attr_1, attr_2)

  • 相关阅读:
    执法记录仪如何防抖
    69. x 的平方根
    docker在虚拟机中的应用
    Windows 10企业版安装Linux子系统-Ubuntu20.04
    数商云SCM系统供应商准入协同业务场景 | 助力建筑建材企业规范供应商准入环节
    Redis 删除策略
    idea创建spark项目
    centos7篇---安装nvidia-docker
    英语学习:M开头
    spring boot 2.7 -> 3.0升级指南
  • 原文地址:https://blog.csdn.net/lxd_max/article/details/131039410