簡體   English   中英

多種DAL設計模式

[英]Multiple DAL design pattern

我對python比較陌生。 我正在構建一個系統,該系統最初將從數據庫中獲取數據,但是在將來的某個時候,我們將從服務中獲取數據。 為了解決這個問題,我創建了一個稱為BaseDAL的抽象基類,它定義了我的數據獲取器:

class BaseDAL(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def get_securities(self):
        pass

    @abstractmethod
    def get_security_data(self, ticker):
        pass

這里的想法是,最初的具體實現將從數據庫中獲取,但是當服務准備就緒時,我將簡單地創建另一個從該服務獲取的具體實現。

這是針對此類問題的正確設計/解決方案嗎?

其次,基於從配置文件讀取的類名,有條件地實例化具體提供程序的好方法是什么。 我想像這樣的東西..但是需要有關如何從字符串名稱實例化實例的幫助:

class DALFactory(object):
    """reads a config file, creates a concrete provider, and always return that instance"""

    __provider = None
    def __init__(self):
        pass

    @classmethod
    def get_provider(cls):
        if cls.__provider is None:
            cls.__provider = get_provide_type_from_config()

        return cls.__provider

看來您是Java程序員。 設計模式,抽象方法和復雜的繼承層次結構在Python中實際上是未知的:由於使用鴨子類型,沒有令人信服的理由讓您的其他DAL*類從BaseDAL繼承-具有適當命名方法的兄弟類可以完成工作以及更少的冗長程度。

Getter和Setter基本上也沒有使用:只需訪問所需的實際屬性即可。 如果以后需要將其重構為方法,則可以在該方法上使用@property ,而無需進行任何更改。

簡單勝於復雜。

編輯:如果DBDalWSDal是您的兩個類,則可以像這樣創建一個簡單的“工廠”(利用一流的功能):

def make_dal(name):
    return {
        'DBDal identifier string': DBDal,
        'WSDal identifier string': WSDal
    }[name]()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM