✍ 个人博客:https://blog.csdn.net/Newin2020?type=blog
专栏地址:https://blog.csdn.net/newin2020/category_12801353.html
专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们一起交流~
专栏简介:在这个专栏,我将带着大家从 0 开始入门 Python 的学习。在这个 Python 的新人系列专栏下,将会总结 Python 入门基础的一些知识点,方便大家快速入门学习~
❤️ 如果有收获的话,欢迎点赞 收藏 关注,您的支持就是我创作的最大动力
设计模式是一种解决特定问题的经验、一种通用的解决方案,它有如下优点:
设计模式通常根据其目的和用途进行分类,常见的分类包括:
单例模式是一种设计模式,它的核心是确保一个类只有一个实例存在。
单例模式的主要应用场景包括:
通过单例设计模式,可以避免多个对象创建导致的性能开销、防止多线程带来的多实例化问题,也可以针对一些敏感的资源做访问限制。
最简单的方式就是通过模块实现单例模式的功能,因为从其它地方导入模块,这个模块肯定只有一个来源。
class Singleton:
def __init__(self, name):
self.name = name
def do(self):
pass
a = Singleton("张三")
from my_test import a
上述实现方法过于简单,没有什么含金量,一般面试的时候也肯定是想问如何用装饰器的方式来实现。因此,下面来看看装饰器是如何实现的,下述代码中:
这样就保证了 MySingleton 类始终只有一个实例被创建和使用。
def singleton(cls):
instances = {} # 创建一个空字典
def get_instance(*args, **kwargs):
"""
判断空字典中是否已经存在cls类:
- 如果不存在,就新创建一个类对象,并存放到字典中
- 如果存在,直接返回存在字典中的类对象
"""
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return get_instance
@singleton
class MySingleton:
def __init__(self):
self.data = "This is a singleton instance"
instance1 = MySingleton()
instance2 = MySingleton()
print(instance1 is instance2) # True
另外,new 的实现方法也和装饰器有异曲同工之处,下述代码中:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
s1 = Singleton()
s2 = Singleton()
print(s1 is s2) # True
工厂模式也是常用的设计模式之一,它是一种创建对象的设计模式。它的核心思想是将对象的创建与使用分离,通过一个工厂类来负责创建对象,即将实例化对象的过程封装起来,而客户端就不需要知道具体的创建细节。
工厂模式主要有三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。
假设我们有一个生产不同类型汽车的场景,有 “经济型轿车” 和 “豪华型轿车” 两种类型。在下述代码中:
from abc import ABC, abstractmethod
# 抽象类
class Car(ABC):
@abstractmethod
def drive(self):
pass
class EconomyCar(Car):
def drive(self):
print("Driving an economy car")
class LuxuryCar(Car):
def drive(self):
print("Driving a luxury car")
class CarFactory:
def create_car(self, car_type):
if car_type == 'economy':
return EconomyCar()
elif car_type == 'luxury':
return LuxuryCar()
# 客户端代码
factory = CarFactory()
economy_car = factory.create_car('economy')
economy_car.drive()
luxury_car = factory.create_car('luxury')
luxury_car.drive()
Tips:抽象类
如果一个类继承自 ABC,且其中的方法加上了 @abstractmethod 的标签,那么这个类就是抽象类,它只能被其它类继承且其中的方法不能被实例化。
在下述示例中:
from abc import ABC, abstractmethod
# 抽象产品类
class Product(ABC):
@abstractmethod
def show(self):
pass
# 具体产品类 1
class ConcreteProduct1(Product):
def show(self):
print("This is ConcreteProduct1")
# 具体产品类 2
class ConcreteProduct2(Product):
def show(self):
print("This is ConcreteProduct2")
# 抽象工厂类
class Factory(ABC):
@abstractmethod
def create_product(self):
pass
# 具体工厂类 1
class ConcreteFactory1(Factory):
def create_product(self):
return ConcreteProduct1()
# 具体工厂类 2
class ConcreteFactory2(Factory):
def create_product(self):
return ConcreteProduct2()
# 客户端代码
factory1 = ConcreteFactory1()
product1 = factory1.create_product()
product1.show()
factory2 = ConcreteFactory2()
product2 = factory2.create_product()
product2.show()
Tips:
在下述示例中:
from abc import ABC, abstractmethod
# 抽象产品 - 椅子
class Chair(ABC):
@abstractmethod
def sit(self):
pass
# 抽象产品 - 桌子
class Table(ABC):
@abstractmethod
def put_stuff(self):
pass
# 具体产品 - 现代风格椅子
class ModernChair(Chair):
def sit(self):
print("Sitting on a modern chair")
# 具体产品 - 现代风格桌子
class ModernTable(Table):
def put_stuff(self):
print("Putting stuff on a modern table")
# 具体产品 - 古典风格椅子
class ClassicChair(Chair):
def sit(self):
print("Sitting on a classic chair")
# 具体产品 - 古典风格桌子
class ClassicTable(Table):
def put_stuff(self):
print("Putting stuff on a classic table")
# 抽象工厂
class FurnitureFactory(ABC):
@abstractmethod
def create_chair(self):
pass
@abstractmethod
def create_table(self):
pass
# 具体工厂 - 现代风格家具工厂
class ModernFurnitureFactory(FurnitureFactory):
def create_chair(self):
return ModernChair()
def create_table(self):
return ModernTable()
# 具体工厂 - 古典风格家具工厂
class ClassicFurnitureFactory(FurnitureFactory):
def create_chair(self):
return ClassicChair()
def create_table(self):
return ClassicTable()
# 客户端代码
# 选择现代风格工厂
factory = ModernFurnitureFactory()
chair = factory.create_chair()
table = factory.create_table()
chair.sit()
table.put_stuff()
# 选择古典风格工厂
factory = ClassicFurnitureFactory()
chair = factory.create_chair()
table = factory.create_table()
chair.sit()
table.put_stuff()
4.1.1 特点
责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象都有机会处理请求,从而将请求的发送者和接收者解耦。
在责任链模式中,通常会创建一系列的处理对象(节点),每个对象都包含对下一个处理对象的引用,形成一个链。当有请求发送时,它会从链的头部开始依次传递,直到有一个处理对象能够处理该请求为止。
在下述示例中,创建了三个处理者 ConcreteHandler1、ConcreteHandler2 和 ConcreteHandler3,它们形成了一个责任链。根据请求的不同,由相应的处理者进行处理。
import abc
class Handler:
def __init__(self, successor=None):
self.successor = successor
@abc.abstractmethod
def handle_request(self, request):
pass # 这个方法通常在具体的子类中实现,如果当前节点不能处理,则传递给下一个节点
class ConcreteHandler1(Handler):
def handle_request(self, request):
if request < 10:
print(f"ConcreteHandler1 处理了请求 {request}")
elif self.successor:
self.successor.handle_request(request)
class ConcreteHandler2(Handler):
def handle_request(self, request):
if 10 <= request < 20:
print(f"ConcreteHandler2 处理了请求 {request}")
elif self.successor:
self.successor.handle_request(request)
class ConcreteHandler3(Handler):
def handle_request(self, request):
if request >= 20:
print(f"ConcreteHandler3 处理了请求 {request}")
else:
print(f"没有合适的处理者来处理请求 {request}")
# 创建责任链
handler1 = ConcreteHandler1()
handler2 = ConcreteHandler2()
handler3 = ConcreteHandler3()
handler1.successor = handler2
handler2.successor = handler3
# 发送请求
handler1.handle_request(5) # ConcreteHandler1 处理了请求 5
handler1.handle_request(15) # ConcreteHandler2 处理了请求 15
handler1.handle_request(25) # ConcreteHandler3 处理了请求 25