[英]Appropriate place for factory class specific generic functions (abstract class?)
我还没有在Stack Overflow上找到针对这个特定问题的答案,所以我将其发布在这里。
我有一个工厂类,该类根据需要的数据库从抽象类生成数据库处理对象(请参见代码)。
我的问题是这个; 我有一些仅适用于数据库处理程序的通用方法...所以我认为将它们放入自己的模块中是不合适的...但是我不确定放置它们的适当位置。
将它们放在抽象类中当然可以,但是我不知道那是它们被接受的地方。
抽象类
class DBHandlerAbstract(object): # ABSTRACT CLASS ---
__metaclass__ = abc.ABCMeta
# I HAVE TO BE OVERRIDDEN
@abc.abstractmethod
def open(self):
raise NotImplementedError
# I HAVE TO BE OVERRIDDEN
@abc.abstractmethod
def close(self):
raise NotImplementedError
# SHOULD THIS GF GO HERE OR ELSEWHERE???
def _check_host(self):
print 'this will be the same for all dbhandler objects'
工厂级
class DBHandler(object): # FACTORY CLASS ---
"""
This is a factory class that will call and return a subclass.
It is NOT an abstract class.
The objects classes that are instantiated by this factory will be
subclasses of DBHandler
"""
@staticmethod
def handler(service, *args, **kwargs):
# Microsoft SQL (mssql)
if re.match("^(\s*)ms(\s*)sql.*$", str(service.lower())):
return DBHandler_MSSQL(*args, **kwargs)
# MySQL
elif re.match("^(\s*)my(\s*)sql.*$", str(service.lower())):
return DBHandler_MYSQL(*args, **kwargs)
else:
log.error(MSG.DBHandlerNotProvided())
raise TypeError('DBHandler service not provided.')
功能类
class DBHandler_MSSQL(DBHandlerAbstract): # FUNCTIONAL CLASS ---
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
self._check_host()
...stuff and things...
gethandler.py
class test(object):
def __init__(self):
app_name = 'dbhandler_test'
logfile = 'system'
log_level = 10
screendump = True
DBO = DBHandler.handler('mssql')
...stuff and things...
让我们通过排除替代品来解决该设计问题:
_check_host
实现mixin -style,则具体的DBHandler_XXXX不能满足其自己的ctor要求,因此将自身隐式抽象。 因此,将具有有效的具体产品实例,但没有有效的产品类,这不仅不利于维持工厂的生产模式。 显然,您的设计要优于那些柔术。
但是您可以考虑什么
呼吁_check_host
在抽象基类构造函数,并在适当的时候从DBHandler_XXXX显式调用构造函数那个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.