Python中的实现工厂

问题描述 投票:0回答:1

我是Python的新手,我想使用Python类实现工厂模式。

我想为两种不同类型的通信渠道实现一种抽象。例如,套接字和HTTP。

我想保持相同的接口,以便与主应用程序中的这两个通信通道进行通信。这样,如果添加了新的通信通道,则应用程序中的更改将降至最低。

在Python中实现此目标的最佳方法是什么?任何参考资料都会有所帮助。

python-3.x factory-pattern
1个回答
2
投票

工厂的一般实现如下:

  1. 根据接口类型创建接口定义方法。在这里,由于您的界面是用于实现Web协议服务的,因此方法将与您要公开使用的功能有关。尽量保持通用。该接口将具有一个称为protocolType()的抽象方法,该方法将根据协议类型由不同的类实现。这里是HTTP或SOCKET。要在Python中创建接口,您可以使用正式接口-ABC。
import abc.ABC, abc.abstractmethod

# I am omitting __init__ implementation of this class, that is self explanatory
class WebProtocol(ABC):

     @abstractmethod
     def abstract_method_1(self):
        pass

     @abstractmethod
     def protocol_type(self):
        pass

使用WebProtocol接口扩展了基于HTTP或SOCKET的协议的实现。

供参考结帐:http://masnun.rocks/2017/04/15/interfaces-in-python-protocols-and-abcs/

  1. 创建一个Factory类,它将根据协议类型负责管理和提供适当的Web协议服务实现。该工厂主要有两种方法。 一个。提供(Web协议类型);该工厂将保留一个映射,将WebProtocol接口的每个实现映射到其协议类型,该协议类型在init函数中注册。
  2. 再次在此处创建一个Factory接口,公开Factory类的主要功能。即提供

import abc.ABC, abc.abstractmethod


# I am omitting __init__ implementation of this class, that is self explanatory
class Factory(ABC):

    @property
    factory = {}

    def provide(self, factory_type):
    '''
     This method is for providing implementations based on protocolType from the 
     factory
    '''
        factory.get(factory_type, None)

import Factory

# I am omitting __init__ implementation of this class, that is self explanatory
class WebProtocolFactory(Factory):

    factory = {}

    def __init__(self):
        factory['HTTP'] = HttpWebProtocol()
        factory['SOCKET'] = SocketWebProtocol()

  1. 无论何时需要WebProtocol Service的任何特定实现,都只需使用工厂的提供功能(ProtocolType)即可根据协议类型检索特定实现。
import WebProtocolFactory
#For using the factory
webProtocolFactory = WebProtocolFactory()
httpWebProtocol = webProtocolFactory.provide('HTTP')

socketProtocolFactory = webProtocolFactory.provide('SOCKET')
  1. [如果在稍后阶段添加任何新协议,只需创建该协议的实现,并在工厂中注册get,但添加init
函数。
© www.soinside.com 2019 - 2024. All rights reserved.