Прототип (Prototype)
Материал из Вики ИТ мехмата ЮФУ
Назначение
Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа.
Описание
Паттерн-прототип является паттерном-фабрикой, который инициализируется прототипами объектов. Когда такая фабрика создает объект нужного типа, соответствующий объект-прототип клонируется. Таким образом можно передавать различные комбинации типов прототипов в фабрику, не порождая новых подклассов фабрик.
Использование
Паттерн Прототип используется когда:
- Инстанцируемые классы определяются во время выполнения
- Для того чтобы избежать построение иерархий классов-фабрик, параллельных иерархии классов-продуктов
Реализация
Диаграмма классов
Участники
- Prototype - прототип
Объявляет интерфейс клонирования
- Concrete prototype - конкретный прототип
Реализует интерфейс клонирования
- Client - клиент
Создает новый объект с запросом к прототипу клонировать себя
Код
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MazeCommon;
using MazeGameAbstractFactory;
using MazeGame = MazeGameAbstractFactory.MazeGame;
namespace MazegamePrototype
{
class MazePrototypeFactory: MazeFactory
{
private Room prototypeRoom;
private Wall prototypeWall;
private Door prototypeDoor;
public MazePrototypeFactory(Wall w, Room r, Door d)
{
prototypeWall = w;
prototypeRoom = r;
prototypeDoor = d;
}
public override Wall MakeWall()
{
return (Wall)prototypeWall.Clone();
}
public override Door MakeDoor(Room r1, Room r2)
{
Door d = (Door)prototypeDoor.Clone();
d.Initialize(r1,r2);
return d;
}
public override Room MakeRoom(int n)
{
Room r = (Room)prototypeRoom.Clone();
r.RoomNumber = n;
return r;
}
}
class ProgramPrototype
{
static void Main(string[] args)
{
Console.WriteLine("Prototype");
MazeGame game = new MazeGame();
MazePrototypeFactory f = new MazePrototypeFactory(new Wall(),new Room(1),new Door());
game.CreateMaze(f);
}
}
}