Паттерн Builder

Автор работы: Пользователь скрыл имя, 06 Мая 2013 в 16:14, курсовая работа

Краткое описание

Отделяет конструирование сложного объекта от его представления, позволяя использовать один и тот же процесс конструирования для создания различных представлений.
Паттерн Builder используется в таких случаях:
алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой;
процесс конструирования должен обеспечивать различные представления конструируемого объекта.

Содержание

• Постановка задачи
• Описание решения
• Литература

Прикрепленные файлы: 1 файл

Отчёт10002.docx

— 52.68 Кб (Скачать документ)

 

 

Отчёт о выполненной  курсовой работе

По курсу «Програмирование»

Студента группы ПК-10-1

Гусейнова Мехти Юсиф оглы

Кафедра компьютерных технологий

ДНУ 2012 уч.г.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

КУРСОВАЯ РАБОТА ПО КУРСУ ПРОГРАМИРОВАНИЕ

Содержание

• Постановка задачи

• Описание решения

• Литература

• Примечания

 

 

 

 

 

 

 

 

 

 

 

 

ООП И ООП-ПРОЭКТИРОВАНИЯ

Объектно-ориентированное программирование (ООП) – парадигма программирования, в которой основной идеей являются понятия объектов и классов. В центре ООП находится понятие объекта. Объект — это сущность, которой можно посылать сообщения, и которая может на них реагировать, используя свои данные. Данные объекта скрыты от остальной программы. 

Основными чертами, характеристиками ООП являются: инкапсуляция, наследование, полиморфизм.

Основные понятия ООП:

  • Инкапсуляция — это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя.
  • Наследование — это свойство системы, позволяющее описать новый класс на основе уже существующего, с частично или полностью заимствующейся функциональностью. Класс, от которого производится наследование, называется базовым, родительским или суперклассом. Новый класс — потомком, наследником или производным классом.
  • Полиморфизм — это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
  • Класс – это модель ещё не существующего объекта,  описываемая на языке терминологии (пространства имён). Класс – это абстрактный тип данных. Фактически класс описывает устройство объекта, являясь своего рода чертежом. Говорят, что объект — это экземпляр класса. Класс состоит из двух частей: поля класса, методы класса. Поля – данные, которые составляют структуру создаваемого объекта. Методы – набор функции-члены класса, которые будут доступны с помощью объекта для изменения содержимого объекта или выполнения какого-либо другого действия.
  • Объект – сущность, проявляющаяся при создании экземпляра класса или копировании прототипа. Объект – значение определённого класса, внутренняя структура которого зависит от структуры класса, чьим экземпляром он является.
  • Прототип — это объект-образец, по образу и подобию которого создаются другие объекты. Объекты-копии могут сохранять связь с родительским объектом, автоматически наследуя изменения в прототипе; эта особенность определяется в рамках конкретного языка.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Постановка задачи:

Описать паттерны проектирования заданные в индивидуальном задании, предоставить реализацию на С++ с примерами.   

Паттерн Builder:

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

 

Паттерн Builder используется в таких случаях:

  1. алгоритм создания сложного объекта не должен зависеть от того, из каких частей состоит объект и как они стыкуются между собой;
  2. процесс конструирования должен обеспечивать различные представления конструируемого объекта.

 

Структура паттерна Builder:


 





 



Пример задачи:

Как пример задачи, решаемой паттерном Builder, в данном случае будет «конструирование» автомобиля. Пусть задан завод на котором создаются автомобили нескольких категорий: легковые спортивные, минивены и т.д. . Нам необходимо разработать удобную для пользователя программу которая будет выполнять действия по созданию автомобилей но при этом не будет различать какого они типа.

Описание решения:

Для большей  гибкости и возможности использования  программы воспользуемся паттерном  Builder. Выше была приведена структура паттерна, в соответствии с которой и будет происходить разработка программы.

//Product

class Car

{

private:

string CarBrand_;

string Engine_;

int Wheel_;

int Door_;

string Colour_;

public:

Car() // конструктор без параметров инициализирующий поля класса

{

CarBrand_='\0';

Engine_='\0';

Wheel_=0;

Door_=0;

Colour_="White";

}

void setCarBrand (const string &CarBrand)//устанавливает значение  поля                  //CarBrand   марка автомобиля

{

CarBrand_=CarBrand;

}

void setEngine(const string &Engine)// устанавливает значение  поля Engine                 //марка двигателя

 

{

Engine_=Engine;

}

void setWheel(const int &Wheel )// устанавливает значение  поля Wheel            //количество колес

{

Wheel_=Wheel;

}

void setDoor(const int& Door)// устанавливает значение  поля Door

//количество дверей

{

Door_=Door;

}

void setColour(const string & Colour) )// устанавливает значение  поля Colour

            //цвет автомобиля

 

{

Colour_=Colour;

}

void getEvericing ()//вывод готовой продукции

{

cout<<"CarBrand="<<CarBrand_<<"\tEngine="<<Engine_

<<"\tWheel="<<Wheel_<<"\tDoor="<<Door_

<<"\tColour="<<Colour_<<endl;

}

};

 

  Car – класс Product задающий каркас, который в какой-то мере определяет результат выполнения программы.

//Builder

class CarBuilder

{

protected:

Car car_;

public:

 const Car& car()

{

                return car_;

        }

 

        virtual void buildCarBrand() = 0

        virtual void buildEngine() = 0;

        virtual void buildWheel() = 0;

   virtual void buildDoor() = 0;

        virtual void buildColour() = 0; ;//чисто виртуальные функции                     //которая переопределяются в                                                                   //классах UsualCar и SportCar

};

 

CarBuilder – класс builder, который обеспечивает набор методов, которые будут использоваться классами Special Builder. Другими словами класс Builder предостовляет абстрактый интерфейс для создания объектов.// ConcreteBuilder

class UsualCar:public CarBuilder

{

public:

void buildCarBrand()

{

car_.setCarBrand("Mercedec");

}

void buildEngine()

{

car_.setEngine("V6");

}

void buildWheel()

{

car_.setWheel(4);

}

void buildDoor()

{

car_.setDoor(5);

}

void buildColour()

{

car_.setColour("Black");

}

};

class SportCar:public CarBuilder

{

public:

void buildCarBrand()

{

car_.setCarBrand("Bugatti Veyron");

}

void buildEngine()

{

car_.setEngine("x10");

}

void buildWheel()

{

car_.setWheel(4);

}

void buildDoor()

{

car_.setDoor(2);

}

void buildColour()

{

car_.setColour("Red");}};

 

UsualCar, SportCar – классы ConcreteBuilder которые определяют типы конечных объектов, реализуя методы предоставленные классом Builder.

class Concern

{

private:

CarBuilder* carBuilder_;//указатель на объект

public:

Concern():carBuilder_(nullptr){}//конструктор без параметров инициализирующий указатель на CarBuilder

~Concern()//деструктор удаление указателя

{

if(carBuilder_)

delete carBuilder_;

}

void carBuilder(CarBuilder* carBuilder)

{

if(carBuilder_)

delete carBuilder_;

carBuilder_ = carBuilder;

}

const Car& getCar()//возвращается результат построения

{

return carBuilder_->car();

}

void carconstruction()//составление объекта

{

carBuilder_->buildCarBrand();

carBuilder_->buildEngine();

carBuilder_->buildWheel();

carBuilder_->buildDoor();

carBuilder_->buildColour();

}

};

 

Concern – класс отвечающий за последовательность действий построения объекта. Принимает объект класса  Concrete builder

как параметр и выполняет необходимые  действия

 

int main()

{

Concern concern;

    concern.carBuilder(new UsualCar);

concern.carconstruction();

Car makecar=concern.getCar();

makecar.getEvericing();

return 0;}

   Паттерн: Pessimistic Offline Lock (Пессимистичная блокировка)

 

Pessimistic Offline Lock – предназначен для предотвращения конфликтов между параллельными бизнес-операциями, позволяя

одновременный доступ к данным только одной бизнес-транзакцие.

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

Существует 3 типа данной блокировки: монопольная блокировка записи(Exclusive write lock), монопольная блокировка чтения(Exclusive read lock), блокировка чтения/записи(read/write lock).

  Блокировка записи(Exclusive write lock) – накладывает ограничение только на редактирование данных, игнорируя при этом процесс чтения. Блокировка чтения(Exclusive read lock) – полная противоположность блокировки записи.

Блокировка  чтения/записи(read/write lock) – обеспечивает самое жесткое ограничение, обеспечивая полное ограничение доступа к информации находящейся в распоряжении другого пользователя.

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

 

Как пример реализации данного паттерна будет  представлен пример с блокировкой  чтения/записи:

 

class Session

{

protected:

// типы  данных которые будут

// считываться с базы данных

public:

 

void GetData(Session &ob1,fstream &base)

{………}

void ChangeData(Session &ob1)

{………}

void ShowData(Session &ob1,fstream &base)

{………}

};

////////////////////////

class Lock

{

private:

bool lock;

static bool Lnumber[10];

public:

int SetLock(int number)

{

lock=Chek(number);

if(lock==false)

{

    cout<<"hahahahahahaha";

exit(1);

}

else

{

 

Lnumber[number]=true;

    cout<<"this="<<Lock::Lnumber[number]<<endl;

    return 0;

}

}

static void GetLock(int number)

{

Lock::Lnumber[number]=0;

}

bool Chek(int number)

{

if(Lnumber[number]==true)

{

cout<<endl<<"Locked"<<endl;

return false;

}

else

{

cout<<endl<<"Open"<<endl;

return true;

}

}

};

bool Lock::Lnumber[10]={};

Lock – класс обеспечивающий блокировку данных.

С помощью  установки определённого значения в массиве Lnumber, и производя сравнение его элемента во время последующего доступа. (Полная реализация будет представлена в разделе «Листинги программ»)

 

class Person

{

private:

int number;//номер, передающийся классу Lock для установления определённого       //значения в массиве Lnumber

public:

Person():number(0){}

int SetData(Session &ob1)

{

//………//

Lock l1;

l1.SetLock(number);

//…………//

}

void GetData(Session &ob1)

 

void ChangeData(Session &ob1)

void Out_Lock()//снятие блокировки

 

};

 

ЛИСТИНГИ ПРОГРАММ

 

BUILDER

#include<iostream>

#include<string>

using namespace std;

////////////////////

//Product

class Car

{

private:

string CarBrand_;

string Engine_;

int Wheel_;

int Door_;

string Colour_;

public:

Car()

{

CarBrand_='\0';

Engine_='\0';

Wheel_=0;

Door_=0;

Colour_="White";

}

void setCarBrand (const string &CarBrand)

{

CarBrand_=CarBrand;

}

void setEngine(const string &Engine)

{

Engine_=Engine;

}

void setWheel(const int &Wheel)

{

Wheel_=Wheel;

}

void setDoor(const int& Door)

{

Door_=Door;

}

void setColour(const string & Colour)

{

Colour_=Colour;

}

void getEvericing ()

{

cout<<"CarBrand="<<CarBrand_<<"\tEngine="<<Engine_

<<"\tWheel="<<Wheel_<<"\tDoor="<<Door_

<<"\tColour="<<Colour_<<endl;

}

};

//////////////////////

//Builder

class CarBuilder

{

protected:

Car car_;

public:

 const Car& car()

{

                return car_;

        }

 

        virtual void buildCarBrand() = 0;

        virtual void buildEngine() = 0;

        virtual void buildWheel() = 0;

virtual void buildDoor() = 0;

virtual void buildColour() = 0;

};

//////////////////////////

class UsualCar:public CarBuilder

{

public:

void buildCarBrand()

{

car_.setCarBrand("Mercedec");

}

void buildEngine()

{

car_.setEngine("V6");

}

void buildWheel()

{

car_.setWheel(4);

}

void buildDoor()

{

car_.setDoor(5);

}

void buildColour()

{

car_.setColour("Black");

}

};

class SportCar:public CarBuilder

{

public:

void buildCarBrand()

{

car_.setCarBrand("Bugatti Veyron");

}

void buildEngine()

{

car_.setEngine("x10");

}

void buildWheel()

{

car_.setWheel(4);

}

void buildDoor()

{

car_.setDoor(2);

}

void buildColour()

{

car_.setColour("Red");

}

};

//////////////////////////////

class Concern

{

private:

CarBuilder* carBuilder_;

public:

Concern():carBuilder_(nullptr){}

~Concern()

{

if(carBuilder_)

delete carBuilder_;

}

void carBuilder(CarBuilder* carBuilder)

{

if(carBuilder_)

delete carBuilder_;

carBuilder_ = carBuilder;

}

const Car& getCar()

{

return carBuilder_->car();

}

void carconstruction()

{

carBuilder_->buildCarBrand();

carBuilder_->buildEngine();

carBuilder_->buildWheel();

carBuilder_->buildDoor();

carBuilder_->buildColour();

}

};

int main()

{

Concern concern,concern_1;

       concern.carBuilder(new UsualCar);

concern.carconstruction();

Car makecar=concern.getCar();

makecar.getEvericing();

concern.carBuilder(new SportCar);

concern.carconstruction();

Car makecare_1=concern.getCar();

makecare_1.getEvericing();

//Car makecare_2;

//makecare_2.getEvericing();

return 0;

}

 

PESSIMISTIC OFFLINE LOCK

#include<iostream>

#include<fstream>

#include<conio.h>

#include<STDLIB.h>

using namespace std;

///////////////////////////////

class Session//класс реализущий считывание и обработку информации с баз данных

{

protected:

char name[20];

char id[4];

public:

 

void GetData(Session &ob1,fstream &base)

{

base.read(reinterpret_cast<char*>(&ob1),sizeof(ob1));

}

void ChangeData(Session &ob1)

{

cout<<"What do you want to change?\n\tPress 'n' - name;\n\tPress 'i' - id"<<endl;

char ch;

ch=_getch();

switch(ch)

{

case 'n':

{

fflush(stdin);

cin.get(ob1.name,20);

}break;

case 'i':

{

fflush(stdin);

cin>>ob1.id;

}break;

}

}

void ShowData(Session &ob1,fstream &base)

{

base.write(reinterpret_cast<char*>(&ob1),sizeof(ob1));

}

};

////////////////////////

class Lock //класс реализующий блокировку

{

private:

bool lock;

static bool Lnumber[10];

public:

int SetLock(int number)

{

lock=Chek(number);

if(lock==false)

{

    cout<<"hahahahahahaha";

exit(1);

}

else

{

 

Lnumber[number]=true;

    cout<<"this="<<Lock::Lnumber[number]<<endl;

    return 0;

}

}

static void GetLock(int number)

{

Lock::Lnumber[number]=0;

}

bool Chek(int number)

{

if(Lnumber[number]==true)

{

cout<<endl<<"Locked"<<endl;

return false;

}

else

{

cout<<endl<<"Open"<<endl;

return true;

Информация о работе Паттерн Builder