一、创建型模式(5种)
1. 单例模式(Singleton)
- 核心思想:确保一个类仅有一个实例。
- 使用场景:全局配置管理、数据库连接池。
- Python案例:
class AppConfig: _instance = None def __new__(cls): if not cls._instance: cls._instance = super().__new__(cls) cls._instance.load_config() return cls._instance def load_config(self): self.settings = { "theme": "dark", "language": "zh"} # 使用 config1 = AppConfig() config2 = AppConfig() print(config1 is config2) # True
2. 工厂方法模式(Factory Method)
- 核心思想:由子类决定创建哪种对象。
- 使用场景:支付方式选择、日志记录器。
- Python案例:
from abc import ABC, abstractmethod class Payment(ABC): @abstractmethod def pay(self, amount): pass class Alipay(Payment): def pay(self, amount): print(f"支付宝支付:{ amount}元") class WechatPay(Payment): def pay(self, amount): print(f"微信支付:{ amount}元") class PaymentFactory(ABC): @abstractmethod def create_payment(self): pass class AlipayFactory(PaymentFactory): def create_payment(self): return Alipay() # 使用 factory = AlipayFactory() payment = factory.create_payment() payment.pay(100) # 支付宝支付:100元
3. 抽象工厂模式(Abstract Factory)
- 核心思想:创建一组相关对象的接口。
- 使用场景:跨平台UI组件库。
- Python案例:
class LinuxButton: def render(self): print("Linux风格按钮") class MacButton: def render(self): print("Mac风格按钮") class GUIFactory(ABC): @abstractmethod def create_button(self): pass class LinuxFactory(GUIFactory): def create_button(self): return LinuxButton() # 使用 factory = LinuxFactory() button = factory.create_button() button.render() # Linux风格按钮
4. 建造者模式(Builder)
- 核心思想:分步骤构建复杂对象。
- 使用场景:SQL查询构造器、文档生成器。
- Python案例:
class Pizza: def __init__(self): self.toppings = [] def add_topping(self, item): self.toppings.append(item) class PizzaBuilder: def __init__(self): self.pizza = Pizza() def add_cheese(self): self.pizza.add_topping("芝士") return self def add_pepperoni(self): self.pizza.add_topping("意大利辣香肠") return self def build(self): return self.pizza # 使用 pizza = PizzaBuilder().add_cheese().add_pepperoni().build() print(pizza.toppings) # ['芝士', '意大利辣香肠']
5. 原型模式(Prototype)
- 核心思想:通过克隆现有对象创建新对象。
- 使用场景:对象创建成本高时。
- Python案例:
import copy class Prototype: def clone(self): return copy.deepcopy(self) class Car(Prototype)