2016-09-17 2 views
0

Я понял, что командный шаблон относится к поведенческому шаблону, а простой шаблон фабрики решает главным образом проблемы с созданием объекта. Но когда приходит к реализации, я чувствую, что оба следует аналогичным шагам.командный шаблон vs Простой шаблон фабрики в C#

public interface ICommand 
{ 
    string Name { get; } 
    void Execute(); 
} 
public class StartCommand : ICommand 
{ 
    public void Execute() 
    { 
     Console.WriteLine("I am executing StartCommand"); 
    } 
    public string Name 
    { 
     get { return "Start"; } 
    } 
} 
public class StopCommand : ICommand 
{ 
    public void Execute() 
    { 
     Console.WriteLine("I am executing StopCommand"); 
    } 
    public string Name 
    { 
     get { return "Stop"; } 
    } 
} 
public class Invoker 
{ 
    ICommand cmd = null; 
    public ICommand GetCommand(string action) 
    { 
     switch (action) 
     { 
      case "Start": 
       cmd = new StartCommand(); 
       break; 
      case "Stop": 
       cmd = new StopCommand(); 
       break; 
      default: 
       break; 
     } 
     return cmd; 
    } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Invoker invoker = new Invoker(); 
     // Execute Start Command 
     ICommand command = invoker.GetCommand("Start"); 
     command.Execute(); 
     // Execute Stop Commad 
     command = invoker.GetCommand("Stop"); 
     command.Execute(); 
     Console.WriteLine("Command Pattern demo"); 
     Console.Read(); 
    } 
} 

и это пример простой заводской картины.

interface IGet 
    { 
     string ConC(string s1, string s2); 
    } 

    class clsFirst : IGet 
    { 
     public string ConC(string s1, string s2) 
     { 
      string Final = "From First: " + s1 + " and " + s2; 
      return Final; 
     } 
    } 

    class clsSecond : IGet 
    { 
     public string ConC(string s1, string s2) 
     { 
      string Final = "From Second: " + s1 + " and " + s2; 
      return Final; 
     } 
    } 
    class clsFactory 
    { 
     static public IGet CreateandReturnObj(int cChoice) 
     { 
      IGet ObjSelector = null; 

      switch (cChoice) 
      { 
       case 1: 
        ObjSelector = new clsFirst(); 
        break; 
       case 2: 
        ObjSelector = new clsSecond(); 
        break; 
       default: 
        ObjSelector = new clsFirst(); 
        break; 
      } 
      return ObjSelector; 

     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      IGet ObjIntrface = null; 
      int input = Convert.ToInt32(Console.ReadLine()); 
      ObjIntrface = clsFactory.CreateandReturnObj(input); 
      string res = ObjIntrface.ConC("First", "Second"); 

     } 
    } 

Я не видел никакой разницы в реализации. Может ли кто-нибудь помочь мне понять это?

+2

Тот факт, что вы использовали шаблон фабрики для создания команд для шаблона команд, не делает одно похожее на другое ... –

ответ

4

Invoker это шаблон фабрики, но не команды:

public interface ICommandFactory 
{ 
    ICommand CreateCommand(string action); 
} 

public class Invoker : ICommandFactory 
{ 
    public ICommand CreateCommand(string action) 
    { 
     ... 
    } 
} 

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

Так что ваши StartCommand и StopCommand классов только реализация команды.


UPDATE

Во втором примере, где реализована простая фабрика, clsFirst и clsSecond не являются командами, потому что их имена не подразумевают захват любого входа или контекст для выполнения действие - это просто классы, которые реализуют один и тот же интерфейс. У вас должен быть логический метод Invoke или Execute, который подразумевает действие над чем-то (и иногда вы можете отменить это действие). Но если вы не человек, а какой-то ИИ, то IGet и string ConC(string s1, string s2) могут быть полностью определением команды и действия для вас :)

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

+1

Спасибо за ответ. Я хотел бы знать это подробно. Я также обновил образец простой фабричной модели. Не могли бы вы поделиться своими мыслями о том, как я могу отличить оба? –

Смежные вопросы