Прототип (Prototype) — различия между версиями
Материал из Вики ИТ мехмата ЮФУ
Admin (обсуждение | вклад) (→Диаграмма классов) |
Admin (обсуждение | вклад) (→Код) |
||
Строка 28: | Строка 28: | ||
using System.Threading.Tasks; | using System.Threading.Tasks; | ||
using MazeCommon; | using MazeCommon; | ||
+ | using MazeGameAbstractFactory; | ||
+ | using MazeGame = MazeGameAbstractFactory.MazeGame; | ||
− | namespace | + | namespace MazegamePrototype |
{ | { | ||
− | + | class MazePrototypeFactory: MazeFactory | |
{ | { | ||
− | + | private Room prototypeRoom; | |
− | + | private Wall prototypeWall; | |
− | + | private Door prototypeDoor; | |
− | |||
− | |||
− | + | public MazePrototypeFactory(Wall w, Room r, Door d) | |
− | |||
− | public | ||
{ | { | ||
− | + | prototypeWall = w; | |
− | + | prototypeRoom = r; | |
− | + | prototypeDoor = d; | |
− | + | } | |
− | + | ||
− | + | public override Wall MakeWall() | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | public | ||
{ | { | ||
− | + | 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; | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | return | ||
} | } | ||
} | } | ||
− | + | class ProgramPrototype | |
− | |||
− | class | ||
{ | { | ||
static void Main(string[] args) | static void Main(string[] args) | ||
{ | { | ||
− | Console.WriteLine(" | + | Console.WriteLine("Prototype"); |
− | MazeGame game = new MazeGame(); | + | MazeGameAbstractFactory.MazeGame game = new MazeGameAbstractFactory.MazeGame(); |
− | + | MazePrototypeFactory f = new MazePrototypeFactory(new Wall(),new Room(1),new Door()); | |
− | game.CreateMaze( | + | game.CreateMaze(f); |
− | |||
} | } | ||
} | } |
Версия 23:07, 29 августа 2014
Назначение
Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа.
Описание
Паттерн-прототип является паттерном-фабрикой, который инициализируется прототипами объектов. Когда такая фабрика создает объект нужного типа, соответствующий объект-прототип клонируется. Таким образом можно передавать различные комбинации типов прототипов в фабрику, не порождая новых подклассов фабрик.
Использование
Паттерн Прототип используется когда:
- Инстанцируемые классы определяются во время выполнения
- Для того чтобы избежать построение иерархий классов-фабрик, параллельных иерархии классов-продуктов
Реализация
Диаграмма классов
Участники
Код
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");
MazeGameAbstractFactory.MazeGame game = new MazeGameAbstractFactory.MazeGame();
MazePrototypeFactory f = new MazePrototypeFactory(new Wall(),new Room(1),new Door());
game.CreateMaze(f);
}
}
}