Как использовать шаблон Factory с интерфейсом - PullRequest
0 голосов
/ 21 марта 2012

У меня есть следующий интерфейс:

public interface IPlateSubCategory<T> {
   T GetItem(int plateID);
}

И следующие классы, которые реализуют интерфейс:

public class Thermo : IPlateSubCategory<ThermoItem> {
   public ThermoItem GetItem(int plateID) {
      // code that implements GetItem
   }
}
public class Thickness : IPlateSubCategory<ThicknessItem> {
   public ThicknessItem GetItem(int plateID) {
      // code that implements GetItem
   }
}
public class Density : IPlateSubCategory<DensityItem> {
   public DensityItemGetItem(int plateID) {
      // code that implements GetItem
   }
}

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

public class PlateSubCategory_Factory {
   public enum Categories {
      Thermo = 1,
      Thickness = 2,
      Density = 3
   }

   public static IPlateSubCategory GetPlateSubCategory(Categories cat) {
      IPlateSubCategory retObj = null;

      if (cat == Categories.Thermo)
         retObj = new Thermo();
      // other instantiations of classes that implement interface would follow

      return retObj;
   }
}

Любая помощь будет принята с благодарностью.Спасибо!

1 Ответ

1 голос
/ 21 марта 2012

Вы определили IPlateSubCategory<T> как универсальный.Ваш фабричный метод должен возвращать реализацию этого интерфейса.Если вы добавите интерфейс поддержки на свои * классы предметов, например:

public class ThermoItem : IItem
{
}

, то вы можете изменить свою фабрику, чтобы она выглядела следующим образом:

    public static IPlateSubCategory<IItem> GetPlateSubCategory(Categories cat)
    {
        switch (cat)
        {
            case Categories.Thermo:
                return new Thermo();
            case Categories.Thickness:
                return new Thickness();
            case Categories.Density:
                return new Density();
            default:
                throw new ArgumentOutOfRangeException("cat");
        }
    }
...