Мое понимание Шаблона "фабричный метод" (Исправьте меня, если я неправ),
Шаблон "фабричный метод"
"Метод фабрики разрешает клиент делегатам создание продукта (Создание Экземпляра) к подклассу".
Существует две ситуации, в которых мы можем пойти для создания Шаблона "фабричный метод".
(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();
}
Мое понимание Метода фабрики, корректно?
Определите интерфейс для создания объекта , но позвольте подклассам решать , какой класс создавать. Factory Метод позволяет классу откладывать создание экземпляра до подклассов.
более подробная информация и пример здесь: http://www.dofactory.com/Patterns/PatternFactory.aspx
То, что у вас есть, на самом деле больше похоже на 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
.
Да, похоже, это правильный способ реализации, хотя и довольно упрощенный. На самом деле вы можете захотеть учесть передачу различных параметров, которые не всегда могут быть согласованными для всех типов. Словари / Списки / Хеш-таблицы / и т. Д. полезны для этого, как и сериализованные элементы и / или XML и другие динамические вещи.