我有一个非常简单的工厂,它将枚举作为其参数之一来确定应该创建的对象的类型,以及所有正在创建的对象通用的另一个参数.
当我为工厂添加更多的类型来创建我的对象构造函数的参数开始不同,例如:
- public class someFactory {
- public someFactory() {
- }
- public SomeObject newObject(Type type,Object data) {
- return this.newObject(type,data,"");
- }
- public SomeObject newObject(Type type,Object data,Object stringOrObject) {
- SomeObject someObject = null;
- if (type != null) {
- switch(type) {
- case CREATE:
- someObject = new CreateObject(data);
- break;
- case DELETE:
- someObject = new DeleteObject(data,(String)stringOrObject);
- break;
- case EDIT:
- someObject = new EditObject(data,(Object)stringOrObject);
- break;
- default:
- break;
- }
- }
- return someObject;
- }
- }
我不应该使用工厂,只是使用正确的参数来实例化不同类型,或者可以以某种方式改进以使其更灵活?
解决方法
标准Java的事情要做的是向枚举添加一个方法.
- public enum Type {
- CREATE() {
- public SomeObject create(Object data,Object stringOrObject) {
- return new CreateObject(data);
- }
- },[...];
- public SomeObject create(Object data) {
- return create(data,"");
- }
- public abstract SomeObject create(Object data,Object stringOrObject);
- }
正如@Stas Kurilin指出的,如果你可以避免枚举,只需调用静态创建方法的适当的名称和参数,那么你可以解决许多问题.
(其他几个随机点:抛出异常通常比接受null或未知值更好,尝试使用强类型而不是Object,遵守Java编码约定,例如大写类型名称)