选择不同数据库的设计模式

时间:2020-03-16 15:24:26

标签: javascript node.js oop design-patterns

我创建了一个与数据库交互的类:

class MyDatabase {
  connect() { /* ... */ }
}

并且数据库具有两种类型的模式:admin和client。我希望每种模式都有不同的类:

class MyDatabaseAdmin {}

class MyDatabaseClient {}

它们两者都将实现相同的接口,但具有不同的下划线实现。我想知道是否存在一种可实例化父级MyDatabase的设计模式。像这样:

const db = new MyDatabase({ mode: 'admin' })
db.connect() // parent calls MyDatabaseAdmin.connect

我不需要一个完美的答案,只是我应该寻找的方向。

谢谢。

2 个答案:

答案 0 :(得分:1)

如果它们没有共同的代码,那么它们实际上只是两个单独的类。您甚至不希望管理代码出现在浏览器中,因为无论如何都无法在其中使用。

您可能只有一个工厂函数,它可以查看admin参数并实例化相应的数据库对象并将其返回,但我认为我什至不明白为什么您会为此而烦恼。

只需让每个客户端实例化适当的DB对象即可。如果有通用代码,则可以使两个实现都从通用基继承,并将通用代码放入基类。

对!我忘了提一下,但是有一些通用代码……例如,连接和身份验证是完全相同的。您是否偶然知道任何适合此用例的设计模式?我应该研究工厂吗?

我认为具有继承性的通用基类可以解决此问题。它为您提供了放置公共代码的自然位置,而不必在客户端实现中包括服务器端代码。浏览器实现和服务器实现将各自是仅存在于其各自平台上的子类。通用基类将在两个地方都存在并使用。

您只需让客户端实例化适当的叶类,然后共享代码就位于基类中。如果您想隐藏实际的类构造函数,则可以使用工厂函数(这是一个简单的函数,它可以查看条件并为您创建合适的对象并返回它),但是我不确定有任何令人信服的理由使用这里的工厂功能。您只会在目标平台上包含适当的叶类,因此没有地方可以在同一代码中使用一个或另一个。

答案 1 :(得分:0)

您会考虑只拥有“ 用户”吗?那么每个用户都可以具有一个<< strong>角色”,该角色可以是“ 用户”或“ 管理员”。因此,基于该“ 角色”,您将为每个用户定义特权。对于这种情况,我发现此解决方案更容易,但请告知是否与您的情况不符。

相关问题