2012-09-09 98 views
1

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

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

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

我会做以下?:

DatabaseWrapper sqlClient = new SqlClientData(connectionString); 

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

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

非常感谢! PS:我很高兴能够进入软件架构,但仍然是初学者,所以对我来说很容易。 :)

+0

因为我想完全封装具体的类,它仍然是抽象模式? – harsimranb

回答

1

它可能是这个样子:

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

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

+0

尽管Issac也有写回答,但我发现使用enum DBType的实现更容易,并且使用它。谢谢! – harsimranb

2

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

相反的:

DatabaseWrapper sqlClient = new SqlClientData(connectionString); 

用途:

DatabaseWrapper sqlClient = DatabaseWrapper.create(connectionString); 

然后封装静态 “创造” 法内创建逻辑。

+0

抽象工厂模式与抽象模式相同吗? – harsimranb

+1

我相信不是。一个“抽象工厂”,就像它的名字一样,是一个工厂类;一个负责建造物体的类。 “抽象”本身并不是一种设计模式。摘要是什么?类?方法? “摘要”只是一个形容词。 :-) – Isaac

+1

+1提抽象工厂模式。如果说'abstract'不是一个模式(如果可以给出另一个+1),那么你会得到另一个+1。 – jgauffin

0

你有什么已经足够。在施工时您只能与SqlDataClient耦合,此后您只需将DatabaseWrapper传递给所有其他类/方法,其余代码甚至不会知道这是SqlDataClient

要切换到不同的实现,你只需要改变的建造一行代码:

DatabaseWrapper client = new SqlClientData(connectionString); 

DatabaseWrapper client = new MSAccessData(connectionString); 

和你的代码的其余部分将可以正常工作。