Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Звіт ООП Лаб 3.docx
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
125.69 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ УКРАЇНИ

„КИЇВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Факультет прикладної математики

Кафедра програмного забезпечення комп’ютерних систем

Лабораторна робота №3

з дисципліни «Об’єктно-орієнтоване програмування»

на тему

Реалізація породжуючих шаблонів проектування

Варіант №11

Виконав студент

ІІ курсу групи КП-21

Литвин Вадим Олександрович

залікова книжка КП-2112

Перевірив

ст.викладач, к.т.н. Заболотня Т.М.

Оцінка

_____________________________

(дата, підпис)

КИЇВ 2014

Тема роботи: реалізація породжуючих шаблонів проектування.

Мета роботи: ознаойомлення з основними характеристиками всіх породжуючих шаблонів («Прототипу», «Фабричного методу», «Абстрактної фабрики», «Одинака», «Будівельника»), запам’ятовування поширених ситуацій, коли використання цих шаблонів є доцільним, набуття вмінь та навичок реалізації шаблонів під час створення програмного коду.

Варіант 11

  1. За допомогою шаблона проектування реалізувати друк перепусток різних видів (постійних, тимчасових, одноразових тощо), а також ордерів на внесення-винесення техніки на території компанії. В залежності від замовника (одні фірми завжди замовляють перепустки, а інші – бланки ордерів) здійснювати друк тих чи інших документів.

  2. Дід Мороз та Снігуронька формують новорічні подарунки з іграшок, цукерок тощо. Дід Мороз робить подарунки для хлопчиків, куди як іграшку кладе пістолет або машинку. Снігуронька робить подарунки для дівчаток, куди як іграшку кладе ляльку ведмедика. Цукерки для хлопчиків загорнуті у блакитну обгортку, а для дівчаток – у рожеву. За допомогою шаблону «Абстрактна фабрика» забезпечити новорічне свято подарунками для всіх дітей.

Завдання 1 Коротке обґрунтування вибору шаблону проектування

Фабричний Метод вирішує, яку реалізацію інстанціювати. Вирішують або нащадки фабричного методу, або він сам, приймаючи якийсь параметер.

Прототип дозволяє нам створювати копії об’єктів, що уже визначені на стадії дизайну (наприклад, список можливих типів зустрічей) або ж визначаються під час виконання програми («п’ятнична вечірка»), таким чином, відпадає необхідність заповняти всі елементи об’єкту від «А» до «Я». Вже створені або визначені екземпляри об’єкту називаються прототипічними екземплярами (prototypical instances).

Прототип застосовано саме до реалізації перепусток різного типу, а фабричний метод для реалізації вибору створюючого об’єкта (перепустки чи ордера) взалежності від фірми що замовила той чи інший документ.

Uml-діаграмма класів

Рис. №1 UML діаграма класів(Фабричний метод, Прототип)

Текст 1-ї програми

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Permit

{

class Program

{

static void Main(string[] args)

{

Creator myCreator = new Creator();

List<IDocument> forPrint = new List<IDocument>();

/*

myDocument = myCreator.GetDocument("Sokol");

Console.WriteLine(myDocument.GetInfoDocument());

myDocument = myCreator.GetDocument("Rozetka");

Console.WriteLine(myDocument.GetInfoDocument());

*/

for (int i = 0; i < 5; i++ )

forPrint.Add(myCreator.GetDocument2("Rozetka"));

for (int i = 0; i < 5; i++)

forPrint.Add(myCreator.GetDocument2("Sokol"));

for (int i = 0; i < 5; i++)

forPrint.Add(myCreator.GetDocument2("Foxtrot"));

for (int i = 0; i < 5; i++)

forPrint.Add(myCreator.GetDocument2("Eldorado"));

foreach(IDocument tmp in forPrint)

{

Console.WriteLine(tmp.Print());

}

Console.ReadKey();

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Permit

{

interface IDocument

{

string Print();

}

class Order : IDocument

{

public string Print()

{

return "Ордер";

}

}

class Creator

{

private static Permit _permanentPermit = new PermanentPermit();

private static Permit _temporaryPermit = new TemporaryPermit(new DateTime(2014, 4, 15));

private static Permit _oneTimePermit = new OneTimePermit();

public IDocument GetDocument(string firm)

{

if (firm.ToLower() == "rozetka")

{

int key = 0;

Console.WriteLine("Тип:\n1-Постійна\n2-Тимчсова\n3-Одноразова");

while (true)

{

try

{

Console.Write("Ваш вибір: ");

key = Convert.ToInt32(Console.ReadLine());

break;

}

catch

{

continue;

}

}

if (key == 1)

return _permanentPermit.Clone();

else if (key == 2)

return _temporaryPermit.Clone();

else if (key == 3)

return _oneTimePermit.Clone();

}

else if (firm.ToLower() == "sokol")

return new Order();

return null;

}

public IDocument GetDocument2(string firm)

{

if (firm.ToLower() == "rozetka")

return _permanentPermit.Clone();

else if (firm.ToLower() == "eldorado")

return _temporaryPermit.Clone();

else if (firm.ToLower() == "foxtrot")

return _oneTimePermit.Clone();

else if (firm.ToLower() == "sokol")

return new Order();

return null;

}

}

abstract class Permit : IDocument

{

protected string _typeOfPermit;

public Permit(string type)

{

_typeOfPermit = type;

}

public Permit Clone()

{

Permit tmp = (Permit)this.MemberwiseClone();

return tmp;

}

public virtual string Print()

{

return ("Перепустка: " + _typeOfPermit);

}

}

//Постійна

class PermanentPermit : Permit

{

public PermanentPermit() : base("Постійна") { }

}

//Тимчасова

class TemporaryPermit : Permit

{

private int _validDay;

private string _validMonth;

private int _validYear;

public TemporaryPermit(DateTime date)

: base("Тимчасова")

{

_validDay = date.Day;

_validMonth = date.Month.ToString();

_validYear = date.Year;

}

public override string Print()

{

return ("Перепустка: " + _typeOfPermit + " діє до(" + _validDay + " " + _validMonth + " " + _validYear + ")");

}

}

//Одноразова

class OneTimePermit : Permit

{

public OneTimePermit() : base("Одноразова") { }

}

}