关于对象的建造模式

问题是这样的,系统中有很多字典,每个字典都是一个Map,map的key和value组成一个字典项。

我使用简单工厂模式做了一个字典工厂,字典工厂根据用户输入产生用户所需的字典。

字典工厂的职责是,获取用户输入参数(就是一个表示字典名称的String),然后根据这个字典名称实例化对应的DAO(通过一串if else语句),使用DAO查询数据库中对应字典表,获得一个List,再把这个List做成一个Map,返回给客户端。

现在的问题是,在增加字典的时候,如何设计才能保证不用修改字典工厂的代码,即对扩展开放,对修改关闭?

这个问题与工厂模式已经抽象工厂模式所要解决的问题还不一样,工厂模式和抽象工厂模式的目的是要建造不同的产品和不同体现的产品。而在这个问题中,产品都是Map,各个产品的区别仅仅在于数据或者说内容的不同。

大家给我出出主意吧,谢啦。

可以让增加字典这一工作放到xml配置文件中做,不知可否?

我觉得你使用的是静态工厂,静态工厂提供了倾斜的开闭原则支持,也就是说你可以很容易的假如一个新的字典类,但是要在字典工厂里做少量修改。

将字典名称和相应DAO的映射关系写在xml文件中,采用动态加载的方式。或者将实例化DAO的操作抽象成一个abstract类,当新加入字典时,编写相应的该abstract类的子类。在当前工厂中根据输入的字段名称动态加载这些子类。

谢谢各位!两天没有过来,竟然有了这么多回复!

的确,如几位所说,用配置文件来解决映射问题是个不错的办法!

chenye99,关于你说的第二种方案,你的意思是把字典的名称和DAO的名称对应起来,使用反射来实例化DAO类,是吧?

当然也是可以的,但是我总是不太喜欢使用反射,只要有可能就不用,呵呵。

谢谢!

反射机制是把双刃剑,不过用好了对于程序的灵活性和可扩展性有很多好处。原来我对反射也有抵触心里,不愿意用,不过现在用惯了,觉得还是不错的,hoho