如果使用方法而不是“参数”,这仍然是工厂模式

时间:2011-07-23 00:54:16

标签: design-patterns factory-pattern

如果我使用单一方法而不是参数,那么它仍会被视为工厂模式。

例如,而不是这个

public class MapperFactory { // will be made as an instance

    public Mapper<?> typeMapper(String type)
    {
                switch(type){
                case "option1": return new MapperType1();
                case "option2": return new MapperType2();
                case "option3": return new MapperType3();
                }
    }
}

创建一个这样的类,所以你只需要选择MapperFactory.option1();&#39;而不是使用&#39; MapperFactory.typeMapper(&#34; option1&#34;);

public class MapperFactory { // will be made as an instance

        public Mapper<?> option1(){return new MapperType1();}
        public Mapper<?> option2(){return new MapperType2();}
        public Mapper<?> option3(){return new MapperType3();}
}

迎接

2 个答案:

答案 0 :(得分:1)

我不知道这里是否存在严格的规则,但在我看来,你的第二个例子不是工厂模式。我认为工厂模式需要在实现中允许某种动态行为。换句话说,方法必须需要输入(即使工厂方法没有形式参数,它必须获取一些输入来影响实现,无论是通过封闭类,或其他地方获得的一些静态数据)它必须允许根据该输入返回不同类型的可能性。我认为你的第二个例子只是一系列实例化一个精确类并返回它的方法。

所以现在我问,你为什么要首先探索工厂模式?如果在编译时,您始终想要实例化同一个类(即MapperFactory.option1()),为什么不首先使用 new 运算符?在您的第二个示例中,您的“工厂”方法与 new 运算符完全没有任何优势。

答案 1 :(得分:0)

如果您需要以任何方式在战略模式中使用此功能,我建议使用枚举:

public enum Mapper{
  option1{
    public Mapper<?> getInstance(){
      return new MapperType1();
    }
  },
  option2{
    public Mapper<?> getInstance(){
      return new MapperType2();
    }
  },
  option3{
    public Mapper<?> getInstance(){
      return new MapperType3();
    }
  };

  public abstract Mapper<?> getInstance();
}

这样你可以构建如下函数:

public void foo(Mapper mapper){
  Mapper<?> map = mapper.getInstance();
}

如果您计划添加额外的映射器

,那就太棒了