Фабричный метод (Factory Method) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Назначение)
(Варианты)
 
(не показано 6 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
[[Страница_курса_Паттерны_проектирования| К основной странице курса]]
 
[[Страница_курса_Паттерны_проектирования| К основной странице курса]]
 
__NOTOC__
 
__NOTOC__
 +
=== Другое имя ===
 +
Виртуальный конструктор
 
=== Назначение ===
 
=== Назначение ===
 
Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать.
 
Определяет интерфейс для создания объекта и оставляет подклассам решение о том, какой класс инстанцировать.
Строка 8: Строка 10:
 
=== Реализация ===
 
=== Реализация ===
 
==== Диаграмма классов ====
 
==== Диаграмма классов ====
[[Изображение:BuilderCommon.png]]
+
[[Изображение:FactoryCommon.png]]
  
 
==== Участники====
 
==== Участники====
*  
+
*'''Product''' - продукт
 +
Определяет интерфейс объектов, создаваемых фабричным методом
 +
*'''ConcreteProduct''' - конкретный продукт
 +
Реализует интерфейс Product
 +
*'''Creator''' - создатель
 +
Объявляет фабричный метод, возвращающий объект типа Product
 +
 
 +
Может определять реализацию по умолчанию для фабричного метода, а также вызывать фабричный метод для создания объекта Product
 +
*'''ConcreteCreator''' - конкретный создатель
 +
Замещает фабричный метод, возвращая ConcreteProduct
  
 
=== Код===
 
=== Код===
Строка 78: Строка 89:
  
 
=== Достоинства и недостатки ===
 
=== Достоинства и недостатки ===
*  
+
*Недостаток: требуется создавать подкласс класса Creator для переопределения создания даже одного объекта ConcreteProduct
 +
*Предоставляет подклассам хуки для представления расширенной версии объекта
  
 
=== Варианты ===
 
=== Варианты ===
*
+
*Фабричному методу передается параметр, идентифицирующий вид создаваемого объекта
 +
*Использование параметризованного класса фабричного метода для передачи параметра-типа

Текущая версия на 22:55, 29 августа 2014

К основной странице курса

Другое имя

Виртуальный конструктор

Назначение

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

Описание

Реализация

Диаграмма классов

FactoryCommon.png

Участники

  • 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
  • Предоставляет подклассам хуки для представления расширенной версии объекта

Варианты

  • Фабричному методу передается параметр, идентифицирующий вид создаваемого объекта
  • Использование параметризованного класса фабричного метода для передачи параметра-типа