|
设计模式中使用"客户端"问题
很多的书籍中,对模式调用、构造的“客户端”方法都没有描述的很清楚,所以造成一些设计人员的设计错误。在面向对象的设计中,尤其是面向接口编程的过程中,我觉得对象[组]的创建和构造是非常常用和容易范错的地方,只有明确这些部分是"客户端"才能合理的区分对象职责和去掉设计中的"臭味"。
举一个关于工厂方法模式的例子:
复制内容到剪贴板
代码:
public abstract class DirectDAO {
public static DirectDAO getDirectDAO() { //错误的工厂方法
return new SqlServerDirectDAO();
}
public abstract void addFile(LyFile file) throws LyException;
public abstract void addFolder(LyFolder folder) throws LyException;
public abstract void deleteDirectById(String id) throws LyException;
public abstract void updateDirect(LyDirect direct) throws LyException;
public abstract Map getDirectMap() throws LyException;
}
static DirectDAO getDirectDAO()方法是工厂方法,我看到该实现非常不符合开闭原则(OCP),将来有新
实例必须重写该方法,就问我的同事为什么这么设计,他告诉我说,这样作可以由该类本身构造实例(并
举出java.security.MessageDigest.getInstance的例子)。实际上这个错误是不愿在类库设计中依赖于"
客户端"代码构造合理的工厂的原因,该类应该如下设计:
由具体的客户端代码〔一般在main中〕
DirectDAO.setDirectDAO(new SqlServerDirectDAO())来初试化该类,这样则符合OCP。
另外可以参考Ioc的描述。
希望大家多多交流 |
|