Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns by D.pdf
Скачиваний:
25
Добавлен:
19.02.2016
Размер:
2.57 Mб
Скачать

Prototype — Прототип

Прототип, (англ. Prototype) — порождающий шаблон проектирования.Содержание [убрать]

Назначение

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

Проще говоря, это паттерн создания объекта через клонирование другого объекта вместо создания через конструктор.

Применимость

Паттерн используется чтобы:

-избежать дополнительных усилий по созданию объекта стандартным путем (имеется в виду использование ключевого слова 'new', когда вызывается конструктор не только самого объекта, но и конструкторы всей иерархии предков объекта), когда это непозволительно дорого для приложения.

-избежать наследования создателя объекта (object creator) в клиентском приложении, как это делает паттерн abstract factory.

Используйте этот шаблон проектирования, когда система не должна зависеть от того, как в ней создаются, компонуются и представляются продукты:

-инстанцируемые классы определяются во время выполнения, например с помощью динамической загрузки;

-для того чтобы избежать построения иерархий классов или фабрик, параллельных иерархии классов продуктов;

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

Структура

31

Пример реализации using System;

namespace Prototype

{

class MainApp

{

static void Main()

{

// Create two instances and clone each

Prototype p1 = new ConcretePrototype1("I");

Prototype c1 = p1.Clone();

Console.WriteLine("Cloned: {0}", c1.Id);

Prototype p2 = new ConcretePrototype2("II");

Prototype c2 = p2.Clone();

Console.WriteLine("Cloned: {0}", c2.Id);

// Wait for user Console.Read();

}

}

// "Prototype"

abstract class Prototype

{

private string id;

// Constructor

public Prototype(string id)

{

this.id = id;

}

// Property public string Id

{

get

{

return id;

}

}

public abstract Prototype Clone();

}

// "ConcretePrototype1"

class ConcretePrototype1 : Prototype

{

// Constructor

public ConcretePrototype1(string id) : base(id)

{

}

public override Prototype Clone()

{

// Shallow copy

return (Prototype)this.MemberwiseClone();

}

}

32

// "ConcretePrototype2"

class ConcretePrototype2 : Prototype

{

// Constructor

public ConcretePrototype2(string id) : base(id)

{

}

public override Prototype Clone()

{

// Shallow copy

return (Prototype)this.MemberwiseClone();

}

}

}

33

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]