抽象工厂与多种工厂方法

时间:2020-06-27 17:26:00

标签: python python-3.x oop design-patterns

我正在为来自两个不同的股票市场服务器(REST)的GET数据编写一个库,并清理数据。 API服务器具有不同的端点,它们不会以相似的格式返回数据,这意味着必须对其进行数据清理。


抽象工厂方法:

class StockMarketFactory(ABC):
    @abstractmethod
    def create_stock_market_requestor(self) -> AbstractMarketRequestor:
        pass

    @abstractmethod
    def create_data_cleaner(self) -> AbstractDataCleaner:
        pass

class ConcreteMarketRequestorFactory(StockMarketFactory):
    def create_stock_market_requestor(self) -> ConcreteMarketRequestorA:
        return ConcreteMarketRequestorA()

    def create_data_cleaner(self) -> ConcreteMarketCleanerA:
        return ConcreteMarketCleanerA()


class ConcreteFactory2(StockMarketFactory):
    def create_stock_market_requestor(self) -> ConcreteMarketRequestorB:
        return ConcreteMarketRequestorB()

    def create_data_cleaner(self) -> ConcreteMarketCleanerB:
        return ConcreteMarketCleanerB()


class AbstractMarketRequestor(ABC):
    @abstractmethod
    def get_historical_data(self) -> str:
        pass

class ConcreteMarketRequestorA(AbstractMarketRequestor):
    def get_historical_data(self) -> str:
        return "The result of the Market A1."


class ConcreteMarketRequestorB(AbstractMarketRequestor):
    def get_historical_data(self) -> str:
        return "The result of the Market A2."


class AbstractDataCleaner(ABC):
    @abstractmethod
    def clean_and_manipulate_data(self, *args, **kwargs) -> None:
        pass

class ConcreteMarketCleanerA(AbstractDataCleaner):
    def clean_and_manipulate_data(self, historical_data):
        print(f"Historical data is being cleaned on A")


class ConcreteMarketCleanerB(AbstractDataCleaner):
    def clean_and_manipulate_data(self, historical_data):
        print(f"Historical data is being cleaned on B")


def client_code(factory: StockMarketFactory) -> None:
    market_a = factory.create_stock_market_requestor()
    historical_data = market_a.get_historical_data()
    cleaner_a = factory.create_data_cleaner()
    cleaner_a.clean_and_manipulate_data(historical_data)


也可以使用2种不同的“工厂方法”来实现:

  1. 用于请求数据市场
  2. 用于清理数据

从设计角度看,抽象工厂方法似乎很优雅。但是,工厂方法将使其更易于理解。这些是我最好的选择,还是我可以使用其他设计模式?

0 个答案:

没有答案