1

不久前我开始学习设计模式(目前只涉及外观和抽象,但我很享受)。我正在寻找将抽象模式应用于我遇到的问题。问题是:使用一个抽象类和一组方法和属性来支持各种数据库系统,然后底层的具体类(从抽象类继承)将被实现。

我创建了一个 DatabaseWrapper 抽象类,并创建了从 DatabaseWrapper 继承的 SqlClientData 和 MSAccessData 具体类。

但是,我仍然对模式如何在客户端上实现这些类感到有些困惑。

我会做以下事情吗?:

DatabaseWrapper sqlClient = new SqlClientData(connectionString);

这是我在示例中看到的,但这不是我想要的,因为我想封装具体的类;我只希望客户端使用抽象类。这样我就可以在未来支持更多的数据库系统,只需对客户端进行最小的更改,并为实现创建一个新的具体类。

我还在学习,所以这里可能有很多问题。请告诉我如何封装所有具体类,以及我的方法是否有任何问题。

非常感谢!

PS:我很高兴进入软件架构,但仍然是初学者,所以请放轻松。:)

4

3 回答 3

2

好吧,我认为您需要的是抽象工厂模式。

代替:

DatabaseWrapper sqlClient = new SqlClientData(connectionString);

利用:

DatabaseWrapper sqlClient = DatabaseWrapper.create(connectionString);

然后将创建逻辑封装在静态“create”方法中。

于 2012-09-09T03:43:24.697 回答
1

它可能看起来像这样:

DatabaseWrapper dbClient = DBFactory.getInstance(DbType.SQL, connectionString);

几乎所有的设计模式都只是引入了另一层间接和/或抽象。在这种情况下DBFactory,是一个抽象层,它根据DbType枚举选择适当的实现。

于 2012-09-09T03:45:08.873 回答
0

你所拥有的已经足够了。您仅SqlDataClient在构造时耦合,此后您只需传递DatabaseWrapper给所有其他类/方法,其余代码甚至都不知道这是一个SqlDataClient.

要切换到不同的实现,只需要更改一行构造代码:

DatabaseWrapper client = new SqlClientData(connectionString);

DatabaseWrapper client = new MSAccessData(connectionString);

其余代码将保持不变。

于 2012-09-09T08:12:11.430 回答