Прототип (Prototype)

Материал из Вики ИТ мехмата ЮФУ
Версия от 10:03, 30 августа 2014; Admin (обсуждение | вклад) (Назначение)

Перейти к: навигация, поиск

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

Назначение

Облегчает динамическое создание путем определения классов, объекты которых могут создавать свои дубликаты.

Описание

Паттерн-прототип является паттерном-фабрикой, который инициализируется прототипами объектов. Когда такая фабрика создает объект нужного типа, соответствующий объект-прототип клонируется. Таким образом можно передавать различные комбинации типов прототипов в фабрику, не порождая новых подклассов фабрик.

Использование

Паттерн Прототип используется когда:

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

Реализация

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

PrototypeCommon.png

Участники

  • Prototype - прототип

Объявляет интерфейс клонирования

  • ConcretePrototype - конкретный прототип

Реализует интерфейс клонирования

  • 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);
        }
    }
}

Достоинства и недостатки

Варианты