будет ли это все еще фабричным шаблоном, если вместо «параметра» используются методы - PullRequest
0 голосов
/ 23 июля 2011

будет по-прежнему считаться заводским шаблоном, если я буду использовать вместо параметра отдельные методы.

Например, вместо этого

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 ();'вместо использования 'MapperFactory.typeMapper ("option1");

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 ]

1 голос
/ 23 июля 2011

Я не знаю, есть ли здесь жесткое правило, но, на мой взгляд, ваш второй пример не является фабричным. Я думаю, что фабричный шаблон должен учитывать динамическое поведение в реализации. Другими словами, метод должен требовать ввода (даже если фабричный метод не принимает формальных параметров, он должен получить некоторый ввод, чтобы повлиять на реализацию, будь то через поля включающего класса или некоторые статические данные, полученные в другом месте), и это должно предусматривать возможность возврата различных типов на основе этого ввода. Я думаю, что ваш второй пример - это просто серия методов, которые создают конкретный класс и возвращают его.

Итак, теперь я спрашиваю, почему вы в первую очередь изучаете фабричный шаблон? Если во время компиляции вы всегда хотите создать экземпляр одного и того же класса (то есть MapperFactory.option1()), почему бы вам просто не использовать оператор new в первую очередь? Во втором примере ваши «фабричные» методы не дают абсолютно никаких преимуществ перед оператором stock new .

0 голосов
/ 19 августа 2014

Если вам нужно каким-либо образом использовать это в шаблоне стратегии, я бы предложил перечисление:

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

, чтоотлично, если вы планируете добавить дополнительные картографы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...