我刚开始学习设计模式(到目前为止只覆盖了立面和抽象,但我很享受)。我正在寻找将抽象模式应用于我遇到的问题。问题是:使用一个抽象类和一组方法和属性支持各种数据库系统,然后底层的具体类(继承自抽象类)将实现。
我创建了一个DatabaseWrapper抽象类,并创建了继承自DatabaseWrapper的SqlClientData和MSAccessData具体类。
但是,我仍然对模式如何在客户端上实现这些类感到困惑。
我会做以下事情吗?:
DatabaseWrapper sqlClient = new SqlClientData(connectionString);
这是我在一个例子中看到的,但这不是我想要的,因为我想封装具体的类;我只希望客户端使用抽象类。这样我将来可以支持更多的数据库系统,只需对客户端进行最少的更改,并为实现创建一个新的具体类。
我还在学习,所以这里可能有很多错误。请告诉我如何封装所有具体类,以及我的方法是否有任何问题。
非常感谢!
PS:我很高兴进入软件架构,但仍然是初学者,所以请放轻松。 :)答案 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);
并且其余代码将保持不变。