多个DAL设计模式

时间:2014-08-27 03:38:26

标签: python design-patterns

我对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 个答案:

答案 0 :(得分:1)

看起来你是一名Java程序员。设计模式,抽象方法和复杂的继承层次结构在Python中几乎是未知的:因为鸭子类型,没有令人信服的理由让你的其他DAL*类继承BaseDAL - 兄弟类适当地 - 命名方法也可以完成工作,而且冗长程度较低。

Getters和setter也基本上没用:只需访问你想要的实际属性。如果您以后需要将其重构为方法,则可以在方法上使用@property,无需更改任何内容。

Simple is better than complex.

编辑:如果DBDalWSDal是您的两个班级,那么您可以创建一个简单的"工厂"像这样(利用第一类功能):

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