对具有不同参数的类使用工厂模式

时间:2010-12-06 20:49:47

标签: java design-patterns factory factory-pattern

我有一个非常简单的工厂,它将Enum作为其参数之一来确定应该创建的对象的类型,以及另一个对于所有正在创建的对象都是通用的参数。

当我为工厂添加更多类型来创建我的对象时,构造函数的参数开始有所不同,例如:

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;
    }
}

我是否应该使用工厂并使用正确的参数实例化不同的类型,或者可以通过某种方式改进以使其更灵活?

3 个答案:

答案 0 :(得分:3)

要做的标准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编码约定,例如作为大写类型名称。)

答案 1 :(得分:1)

我会创建一个看起来像

的界面
public interface IFactory
{
    SomeObject Create(Object data, String orObject);
    Boolean AppliesTo(Type type);
}

然后,您可以拥有一个Factory类,其中包含用于创建,删除和编辑的三个IFactories的列表,并且可以查询这些工厂的列表,以查找对AppliesTo方法做出响应的第一个工厂。

答案 2 :(得分:0)

使用以下签名创建一个界面

public interface IFactory
{
    GenricType Create(object data, string orObject);

}

让其他对象实现此接口。因此,创造仍然与对象保持一致。工厂模式很好。但是,由于您使用枚举来识别类型,因此最好使用多态,以使其变得可维护。