抽象设计模式实现

时间:2012-09-09 03:33:24

标签: oop design-patterns architecture

我刚开始学习设计模式(到目前为止只覆盖了立面和抽象,但我很享受)。我正在寻找将抽象模式应用于我遇到的问题。问题是:使用一个抽象类和一组方法和属性支持各种数据库系统,然后底层的具体类(继承自抽象类)将实现。

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

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

我会做以下事情吗?:

DatabaseWrapper sqlClient = new SqlClientData(connectionString);

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

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

非常感谢!

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

3 个答案:

答案 0 :(得分:2)

嗯,我认为你需要的是抽象工厂模式。

而不是:

DatabaseWrapper sqlClient = new SqlClientData(connectionString);

使用:

DatabaseWrapper sqlClient = DatabaseWrapper.create(connectionString);

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

答案 1 :(得分:1)

看起来像这样:

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

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

答案 2 :(得分:0)

你拥有的已经足够了。您在构建时只与SqlDataClient相关联,此后您只需将DatabaseWrapper传递给所有其他类/方法,其余代码甚至不知道是SqlDataClient }。

要切换到其他实现,您只需要更改一行构造代码:

DatabaseWrapper client = new SqlClientData(connectionString);

DatabaseWrapper client = new MSAccessData(connectionString);

并且其余代码将保持不变。