Хороший исходный код, который может дать мне преимущество при разработке шаблона проектирования на C # - PullRequest
1 голос
/ 27 июля 2011

Мне кажется, что я должен начать использовать шаблон проектирования фабричного метода в некоторых моих кодах. Вот что я делаю;

Приведенный ниже код - мой класс генератора для пространства имен Accommodation:

namespace Accom {

    public class Generator {

      int? _id;
      string _name;

      public Generator(int? id = null, string name = null) {
          _id = id;
          _name = name;
      }

      public string GetBaseUrl() { 

          //some logic sits here.

          return somestring;

      }

      //Can have some other methods as well

    }

}

У меня будет такой же запуск для пространства имен Traf:

namespace Traf {
    public class Generator {
      int? _id;
      string _name;

      public Generator(int? id = null, string name = null) {
          _id = id;
          _name = name;
      }

      public string GetBaseUrl() { 
          //some logic sits here. Same one with the Accom.

          return somestring;
      }

      //Can have some other methods as well
    }
}

Итак, это будет повторяться снова и снова.

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

Может кто-нибудь помочь мне в этом и указать хороший исходный код, который я смогу прочитать и понять?

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

Я думаю эта статья проекта кода на AbstractFactoryPattern довольно неплохо работает, предоставляя полезный пример.

Однако, если у вас нет веских причин, вам не следует создавать один и тот же класс в нескольких разных пространствах имен. Вы всегда можете использовать using Accom; для доступа к вашему классу Generator из пространства имен Traf.


Отредактируйте в ответ на комментарий, что каждый Генератор в отдельном пространстве имен будет иметь свой набор методов.

Вы не можете использовать абстрактный шаблон фабрики, если реализации будут иметь разные методы. Идея абстрактного шаблона фабрики состоит в том, чтобы создать общий интерфейс, который будут реализованы всеми объектами, возвращаемыми фабрикой, а затем использовать некоторый контекст на фабрике, чтобы выбрать правильную реализацию для данной ситуации.

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

Однако, если вам нужен доступ к методам, специфичным для реализации, вы не сможете получить к ним доступ через общий интерфейс, что означает, что вы не получаете преимущества Inversion of Control, а это означает, что нет реальной причины использовать абстрактный шаблон фабрики.

0 голосов
/ 27 июля 2011
  • Создать абстрактный класс для генератора
  • создать дочерний класс для разных типов генератора
  • Сделать фабричный класс
  • Сделать фабрику как синглтон
  • Создать один метод (Common), который будет принимать параметр в виде строки (с пространством имен, если классы находятся в другом пространстве имен)
  • Использование отражения для создания экземпляра другого объекта в методе common
  • возвращает базовый тип из общего числа
  • Создание разных методов (A, B, C) для получения другого экземпляра, вызов метода (Common)
  • приведение результата от общего к типу, который вы хотите вернуть

EDIT

public abstract class Generator
{
    public Generator(int? i, string name) { }
    public abstract string GetBaseUrl();
}

public class GeneratorA : Generator
{
    public GeneratorA(int? i, string name) : base(i, name) { }
}
public class GeneratorB : Generator
{
    public GeneratorB(int? i, string name) : base(i, name) { }
}
public class GeneratorFactory
{
    // Make singleton
    public GeneratorB GenerateB(int? i, string name)
    {
        return (GeneratorB)this.Generate(i, name, "GeneratorB");
    }

    public GeneratorA GenerateA(int? i, string name)
    {
        return (GeneratorA)this.Generate(i, name, "GeneratorA");
    }

    public Generator Generate(int? i, string name, string genType)
    {
        return new GeneratorA(); // use reflection to generate child generator based on string "genType"
    }
}
...