多层数据访问层设计模式

1 投票
1 回答
691 浏览
提问于 2025-04-18 18:40

我对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

1 个回答

1

看起来你是个Java程序员。在Python中,设计模式、抽象方法和复杂的继承关系几乎不被使用。这是因为Python有一种叫做“鸭子类型”的特性,这意味着你不需要让其他的 DAL* 类去继承自 BaseDAL。只要兄弟类的方法命名得当,同样可以完成任务,而且代码会更简洁。

另外,获取器和设置器基本上也不常用:你可以直接访问你想要的属性。如果以后需要把它改成一个方法,只需在方法上加上 @property,其他地方就不用改了。

简单总比复杂好。

补充:如果 DBDalWSDal 是你的两个类,你可以像这样创建一个简单的“工厂”(利用一等函数的特性):

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

撰写回答