设计模式--创建模式-工厂方法模式

工厂方法模式


工厂方法模式(Factory Method Pattern)是一种创建型设计模式,旨在通过定义一个创建对象的接口,使得子类决定实例化哪一个类。工厂方法模式允许一个类将实例化的任务推迟到其子类,从而使得代码更具扩展性和灵活性。

工厂方法模式的核心思想是通过一个抽象的工厂接口来创建对象,而具体的对象创建逻辑交给不同的子类去实现。这样,客户端代码不需要关心对象的具体创建过程,只需要通过工厂接口来获取对象实例。


结构

1. Product(产品): 定义产品的接口。

2. ConcreteProduct(具体产品): 实现`Product`接口的具体类,代表工厂方法模式创建的具体对象。

3. Creator(创建者): 定义一个工厂方法接口,返回一个`Product`对象。`Creator`可能包含一些通用的业务逻辑。

4. ConcreteCreator(具体创建者): 实现`Creator`接口,具体实现创建`Product`的逻辑。


UML类图


+--------------------+       +---------------------+
|    Creator         |<>---->|      Product        |
+--------------------+       +---------------------+
| +factoryMethod():Product|          ^       
+--------------------+               | 
         ^                  +---------------------+
         |                  | ConcreteProduct     |
+--------------------+       +---------------------+
| ConcreteCreator    |       
+--------------------+       
| +factoryMethod():Product  |  
+--------------------+       

示例

# -*- coding: utf-8 -*-
# Date: 2025/1/11

from abc import ABCMeta, abstractmethod

# 定义产品
class Payment(metaclass=ABCMeta):
    #  必须实现pay函数
    @abstractmethod
    def pay(self, money):
        pass

# 具体产品
class Alipay(Payment):
    
    def pay(self, money):
       print(f'支付宝支付{money}元。')

# 具体产品
class Wepay(Payment):
    
    def pay(self, money):
        print('微信支付 %d 元。' % money)

# 简单工厂模式,在工厂中根据参数创建指定的产品
class PaymenCreator():
    def create_payment(self, method):
        if method == 'Alipay':
            return Alipay()
        
        if method == 'Wepay':
            return Wepay()
        
        raise TypeError('No such payment named %s.' % method)

# 定义创建产品的接口
class CreatePayment(metaclass=ABCMeta):
    @abstractmethod
    def create_payment(self):
        pass

class AlipayFactory(CreatePayment):
    def create_payment(self):
        return Alipay()
    
class WepayFactory(CreatePayment):
    def create_payment(self):
        return Wepay()

if __name__ == '__main__':
    ali = AlipayFactory()
    alipay = ali.create_payment()
    alipay.pay(10)


文章标签:

评论(0)