Разъяснение Шаблона "фабричный метод"

Мое понимание Шаблона "фабричный метод" (Исправьте меня, если я неправ),

Шаблон "фабричный метод"

"Метод фабрики разрешает клиент делегатам создание продукта (Создание Экземпляра) к подклассу".

Существует две ситуации, в которых мы можем пойти для создания Шаблона "фабричный метод".

(i) Когда клиент ограничивается продуктом (Экземпляр) создание.

(ii) Существует несколько доступных продуктов. Но решение, которое будет сделано, какой экземпляр продукта должен быть возвращен.

Если Вы хотите создать шаблон Абстрактного метода

  • У Вас должен быть абстрактный продукт
  • Конкретный продукт
  • Метод фабрики возвратить соответствующий продукт.

Пример:

public enum ORMChoice
{
  L2SQL,
  EFM,
  LS,
  Sonic
}
//Abstract Product
public interface IProduct
{
   void ProductTaken();
}
//Concrete Product
public class LinqtoSql : IProduct
{
  public void ProductTaken()
  {
    Console.WriteLine("OR Mapping Taken:LinqtoSql");
  }
 }
//concrete product
 public class Subsonic : IProduct
 {
    public void ProductTaken()
    {
       Console.WriteLine("OR Mapping Taken:Subsonic");
    }
 }
//concrete product
 public class EntityFramework : IProduct
 {
    public void ProductTaken()
    {
       Console.WriteLine("OR Mapping Taken:EntityFramework");
    }
  }
//concrete product
 public class LightSpeed : IProduct
 {
   public void ProductTaken()
   {
     Console.WriteLine("OR Mapping Taken :LightSpeed");
    }
  }

 public class Creator
 {
    //Factory Method 
    public IProduct ReturnORTool(ORMChoice choice)
    {
      switch (choice)
      {
        case ORMChoice.EFM:return new EntityFramework();
        break;
        case ORMChoice.L2SQL:return new LinqtoSql();
        break;
        case ORMChoice.LS:return new LightSpeed();
        break;
        case ORMChoice.Sonic:return new Subsonic();
        break;
        default: return null;
      }
  }

 }

**Client**

Button_Click()
{
 Creator c = new Creator();
 IProduct p = c.ReturnORTool(ORMChoice.L2SQL);
 p.ProductTaken();

}

Мое понимание Метода фабрики, корректно?

6
задан user274364 29 March 2010 в 18:02
поделиться

3 ответа

Определите интерфейс для создания объекта , но позвольте подклассам решать , какой класс создавать. Factory Метод позволяет классу откладывать создание экземпляра до подклассов.

более подробная информация и пример здесь: http://www.dofactory.com/Patterns/PatternFactory.aspx

0
ответ дан 18 December 2019 в 04:52
поделиться

То, что у вас есть, на самом деле больше похоже на Abstract Factory Pattern , только ваша фабрика ( Creator ) не является абстрактной. Шаблон факторного метода особенно полезен для создания подклассов:

class A {
public:
    A() : m_Member( GetMember() ) 
    {
    }
protected:
    virtual ISomeInterface * GetMember() { // default impl here }
private:
    ISomeInterface * m_Member;
}

Теперь подклассы A могут переопределять GetMember , чтобы суперкласс использовал конкретную реализацию ISomeInterface .

1
ответ дан 18 December 2019 в 04:52
поделиться

Да, похоже, это правильный способ реализации, хотя и довольно упрощенный. На самом деле вы можете захотеть учесть передачу различных параметров, которые не всегда могут быть согласованными для всех типов. Словари / Списки / Хеш-таблицы / и т. Д. полезны для этого, как и сериализованные элементы и / или XML и другие динамические вещи.

-1
ответ дан 18 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: