Фабричный метод (Factory Method) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Другое название) |
Admin (обсуждение | вклад) (→Варианты) |
||
(не показано 11 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
[[Страница_курса_Паттерны_проектирования| К основной странице курса]] | [[Страница_курса_Паттерны_проектирования| К основной странице курса]] | ||
__NOTOC__ | __NOTOC__ | ||
+ | === Другое имя === | ||
+ | Виртуальный конструктор | ||
=== Назначение === | === Назначение === | ||
− | + | Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать. | |
=== Описание === | === Описание === | ||
Строка 8: | Строка 10: | ||
=== Реализация === | === Реализация === | ||
==== Диаграмма классов ==== | ==== Диаграмма классов ==== | ||
− | [[Изображение: | + | [[Изображение:FactoryCommon.png]] |
==== Участники==== | ==== Участники==== | ||
− | * | + | *'''Product''' - продукт |
+ | Определяет интерфейс объектов, создаваемых фабричным методом | ||
+ | *'''ConcreteProduct''' - конкретный продукт | ||
+ | Реализует интерфейс Product | ||
+ | *'''Creator''' - создатель | ||
+ | Объявляет фабричный метод, возвращающий объект типа Product | ||
+ | |||
+ | Может определять реализацию по умолчанию для фабричного метода, а также вызывать фабричный метод для создания объекта Product | ||
+ | *'''ConcreteCreator''' - конкретный создатель | ||
+ | Замещает фабричный метод, возвращая ConcreteProduct | ||
=== Код=== | === Код=== | ||
Строка 78: | Строка 89: | ||
=== Достоинства и недостатки === | === Достоинства и недостатки === | ||
− | * | + | *Недостаток: требуется создавать подкласс класса Creator для переопределения создания даже одного объекта ConcreteProduct |
+ | *Предоставляет подклассам хуки для представления расширенной версии объекта | ||
=== Варианты === | === Варианты === | ||
− | * | + | *Фабричному методу передается параметр, идентифицирующий вид создаваемого объекта |
+ | *Использование параметризованного класса фабричного метода для передачи параметра-типа |
Текущая версия на 22:55, 29 августа 2014
Другое имя
Виртуальный конструктор
Назначение
Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать.
Описание
Реализация
Диаграмма классов
Участники
- Product - продукт
Определяет интерфейс объектов, создаваемых фабричным методом
- ConcreteProduct - конкретный продукт
Реализует интерфейс Product
- Creator - создатель
Объявляет фабричный метод, возвращающий объект типа Product
Может определять реализацию по умолчанию для фабричного метода, а также вызывать фабричный метод для создания объекта Product
- ConcreteCreator - конкретный создатель
Замещает фабричный метод, возвращая ConcreteProduct
Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MazeCommon;
namespace MazeGameFactoryMethod
{
class MazeGame
{
public Maze CreateMaze()
{
Maze aMaze = MakeMaze();
Room r1 = MakeRoom(1);
Room r2 = MakeRoom(2);
Door d = MakeDoor(r1, r2);
aMaze.AddRoom(r1);
aMaze.AddRoom(r2);
r1.SetSide(Direction.North, MakeWall());
r1.SetSide(Direction.East, d);
r1.SetSide(Direction.South, MakeWall());
r1.SetSide(Direction.West, MakeWall());
r2.SetSide(Direction.North, MakeWall());
r2.SetSide(Direction.East, MakeWall());
r2.SetSide(Direction.South, MakeWall());
r2.SetSide(Direction.West, d);
return aMaze;
}
public virtual Maze MakeMaze()
{
return new Maze();
}
public virtual Wall MakeWall()
{
return new Wall();
}
public virtual Room MakeRoom(int n)
{
return new Room(n);
}
public virtual Door MakeDoor(Room r1, Room r2)
{
return new Door(r1, r2);
}
};
class ProgramFactoryMethod
{
static void Main(string[] args)
{
Console.WriteLine("FactoryMethod");
var game = new MazeGame();
Maze m = game.CreateMaze();
}
}
}
Достоинства и недостатки
- Недостаток: требуется создавать подкласс класса Creator для переопределения создания даже одного объекта ConcreteProduct
- Предоставляет подклассам хуки для представления расширенной версии объекта
Варианты
- Фабричному методу передается параметр, идентифицирующий вид создаваемого объекта
- Использование параметризованного класса фабричного метода для передачи параметра-типа