Прототип (Prototype) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Диаграмма классов)
(Код)
Строка 28: Строка 28:
 
using System.Threading.Tasks;
 
using System.Threading.Tasks;
 
using MazeCommon;
 
using MazeCommon;
 +
using MazeGameAbstractFactory;
 +
using MazeGame = MazeGameAbstractFactory.MazeGame;
  
namespace MazeGameBuilder
+
namespace MazegamePrototype
 
{
 
{
     interface MazeBuilder
+
     class MazePrototypeFactory: MazeFactory
 
     {
 
     {
         void BuildMaze();
+
         private Room prototypeRoom;
         void BuildRoom(int n);
+
         private Wall prototypeWall;
         void BuildDoor(int roomFrom, int roomTo);
+
         private Door prototypeDoor;
Maze GetMaze();
 
    };
 
  
    class MazeGame
+
         public MazePrototypeFactory(Wall w, Room r, Door d)  
    {
 
         public Maze CreateMaze(MazeBuilder builder)  
 
 
         {
 
         {
            builder.BuildMaze();
+
    prototypeWall = w;
 
+
    prototypeRoom = r;
            builder.BuildRoom(1);
+
    prototypeDoor = d;
            builder.BuildRoom(2);
+
}
            builder.BuildDoor(1, 2);
+
          
 
+
         public override Wall MakeWall()
            return builder.GetMaze();
 
        }
 
    }
 
 
 
    class StandardMazeBuilder: MazeBuilder
 
    {
 
         private Maze maze;
 
         public virtual void BuildMaze()  
 
 
{  
 
{  
             maze = new Maze();  
+
             return (Wall)prototypeWall.Clone();  
 
         }
 
         }
public virtual void BuildRoom(int n)  
+
       
         {
+
        public override Door MakeDoor(Room r1, Room r2)  
    if (maze.RoomNo(n) == null)
+
         {  
            {
+
    Door d = (Door)prototypeDoor.Clone();
Room r = new Room(n);
+
    d.Initialize(r1,r2);
maze.AddRoom(r);
+
    return d;
r.SetSide(Direction.North, new Wall());
 
                r.SetSide(Direction.South, new Wall());
 
                r.SetSide(Direction.East, new Wall());
 
                r.SetSide(Direction.West, new Wall());
 
    }
 
 
}
 
}
public virtual void BuildDoor(int n1, int n2)  
+
       
 +
        public override Room MakeRoom(int n)
 
         {
 
         {
    Room r1 = maze.RoomNo(n1);
+
            Room r = (Room)prototypeRoom.Clone();
    Room r2 = maze.RoomNo(n2);
+
             r.RoomNumber = n;
    Door d = new Door(r1,r2);
+
             return r;
    r1.SetSide(CommonWall(r1,r2),d);
 
    r2.SetSide(CommonWall(r2,r1),d);
 
}
 
 
 
        public virtual Maze GetMaze()
 
{
 
            return maze;
 
        }
 
 
 
        private Direction CommonWall(Room r1, Room r2)
 
        {
 
            // Информация должна храниться глобально
 
            // Здесь - самый простой вариант для двух комнат
 
             if (r1.RoomNumber == 1 && r2.RoomNumber == 2)
 
                return Direction.East;
 
             return Direction.West;
 
 
         }
 
         }
 
     }
 
     }
  
 
+
     class ProgramPrototype
 
 
     class ProgramBuilder
 
 
     {
 
     {
 
         static void Main(string[] args)
 
         static void Main(string[] args)
 
         {
 
         {
             Console.WriteLine("Builder");
+
             Console.WriteLine("Prototype");
             MazeGame game = new MazeGame();
+
             MazeGameAbstractFactory.MazeGame game = new MazeGameAbstractFactory.MazeGame();
             StandardMazeBuilder b = new StandardMazeBuilder();
+
             MazePrototypeFactory f = new MazePrototypeFactory(new Wall(),new Room(1),new Door());
             game.CreateMaze(b);
+
             game.CreateMaze(f);
            Maze maze = b.GetMaze();
 
 
         }
 
         }
 
     }
 
     }

Версия 23:07, 29 августа 2014

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

Назначение

Задаёт виды создаваемых объектов с помощью экземпляра-прототипа и создаёт новые объекты путём копирования этого прототипа.

Описание

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

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

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

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

Реализация

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

PrototypeCommon.png

Участники

Код

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

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

Варианты