Как применить абстрактный шаблон фабрики? - PullRequest
0 голосов
/ 31 мая 2010

Я новичок в разработке шаблонов, и у меня есть сценарий здесь. Я не уверен, как реализовать шаблон.

  1. У нас есть несколько поставщиков Philips, Onida и т. Д.
  2. Каждый поставщик (филипс, онида и т. Д.) Может иметь разные типы продуктов, то есть плазменные или обычные телевизоры.

Мне нужен конкретный продукт каждого поставщика, использующий абстрактный шаблон фабрики.

Моя реализация пока:

public enum TvType
{
    Samsung = 0, LG = 1, Philips = 2, Sony = 3
}

public enum Product
{
    Plasma = 0, NormalTV = 1
}

Конкретный класс каждого поставщика, который возвращает каждый продукт, а также интерфейс, содержащий ProductInfo, т. Е. Если Vendor равен , что , то он должен иметь этот продукт.

Ответы [ 2 ]

0 голосов
/ 31 мая 2010

Перечисления являются злом. Замените их интерфейсами:

public interface IVendor { /*...*/ }

затем вы можете предоставить конкретные реализации IVender для каждого из ваших поставщиков.

public class Samsung : IVendor { /*...*/ }

public class Philips : IVendor { /*...*/ }

public class Sony : IVendor { /*...*/ }

Моим непонятно, почему вы спрашиваете об абстрактной фабрике или о том, что именно вы хотите делать точно ...

0 голосов
/ 31 мая 2010

В псевдокоде это может выглядеть примерно так:

interface TvFactory {
  NormalTelevision createNormalTv();
  PlasmaTelevision createPlasmaTv();
}

class PhilipsTvFactory implements TvFactory {
  public NormalTelevision createNormalTv() {
    return new PhilipsNormalTelevision();
  }
  public PlasmaTelevision createPlasmaTv() {
    return new PhilipsPlasmaTelevision();
  }
}

class OnidaTvFactory implements TvFactory {
  public NormalTelevision createNormalTv() {
    return new OnidaNormalTelevision();
  }
  public PlasmaTelevision createPlasmaTv() {
    return new OnidaPlasmaTelevision();
  }
}

// similarly for other vendors...

...
// decides - maybe based on config - which factory to use
TvFactory factory = loadTvFactory();
Television myTv = factory.createPlasmaTv();
...