Фабричный метод Выяснение паттернов - PullRequest
6 голосов
/ 29 марта 2010

Мое понимание шаблона фабричного метода: ( Исправьте меня, если я ошибаюсь )

Шаблон фабричного метода

«Фабричный метод позволяет клиенту делегировать создание продукта (создание экземпляра) подклассу».

Есть две ситуации, в которых мы можем перейти к созданию шаблона Factory Method.

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

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

Если вы хотите создать шаблон Abstract Method

  • Вам нужно иметь абстрактный продукт
  • Бетонный продукт
  • Заводской метод возврата соответствующего товара.

Пример:

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

}

Правильно ли я понимаю Фабричный метод?

Ответы [ 3 ]

1 голос
/ 29 марта 2010

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

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

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

0 голосов
/ 29 марта 2010

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

подробностей и пример там: http://www.dofactory.com/Patterns/PatternFactory.aspx

0 голосов
/ 29 марта 2010

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

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