【问题标题】:Factory pattern is the right pattern here?工厂模式是正确的模式吗?
【发布时间】:2017-07-03 14:48:34
【问题描述】:

我有一个要求,基类方法需要进一步细分。需要注册类对象。并且根据配置,我将决定要实例化哪个类。

class Base {
    Base () { }
    void methodOverride() { // do something; }
}

class Derived1 extends Base {
    Derived1 () {
        super();
    }

    void methodOverride() { // specialize }
}

class Derived2 extends Base {
    Derived2 () {
        super();
    }

    void methodOverride() { // specialize }
}

class SelectorFactory {

    Base createClass( int type) {
        switch (type) {
          case DERIVED_1:
             return new Derived1();
          case DERIVED_2:
             return new Derived2();
          case BASE:
             return new Base();
        }
    } 
}

public static void main(String[] args){
    // read configuration
    int type = config.getIntType();

    SelectorFactory factory = new SelectorFactory();
    someRegisterMethod( factory.createClass(type) );
}

问题: 1.您认为还有另一种方法可以推荐吗?这是对这种设计模式的最佳使用吗?

【问题讨论】:

  • A Hashmap<Integer, Base> 是您所展示的另一种方式...除此之外,您能否展示可编译的代码? case Derived1 没有意义
  • 你认为还有其他方法可以实现吗?我对这个问题的回答是肯定的。但这真的对你有帮助吗?您的实际问题是什么?
  • 我应该提到 - 这段代码不会编译。我只是试图模拟代码。
  • 我不明白你为什么对 selectorFactory 类感到困扰。在上面的代码中它没有理由存在。
  • @Matt - 当然,这是我的问题。在这种情况下,您认为正确的方法是什么?注意:基类已经存在于一段我无法编辑的代码中。但是,我使用两个派生类对其进行了专门化来解决我的特定需求。

标签: java design-patterns


【解决方案1】:

如果您在编译时不知道正确的类型,那么有一个工厂是有意义的。

我会使用字符串而不是整数作为标识符。它使代码更容易调试,并且只有在紧密循环中使用工厂时才会损害性能。

【讨论】:

  • 我会选择一个枚举。您甚至可以将枚举本身放入工厂中。
  • @shmosel:每次工厂获得对新实现的支持时,都必须更改枚举。而且,如果您在编译时不知道正确的类型,那并不会真正使代码更具可读性。
  • switch(无论是基于字符串还是基于整数)也必须更改以适应新工厂。并且枚举可以通过名称引用,因此您拥有字符串标识符的所有灵活性和清晰度,而不会出现错误。
  • 只在一个地方,工厂方法。如果枚举在代码中的多个位置使用,它会很有用。对于一个地方,它只是添加更多代码来维护。
猜你喜欢
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多