98440

Паттерны проектирования

Лабораторная работа

Информатика, кибернетика и программирование

Реализовать две конкретные фабрики: первую - создающую класс, описывающий автомобиль BMW и двигатель для него, и вторую - для автомобиля марки Audi. Описать абстрактный класс для автомобилей. В нем должен быть один метод, позволяющий узнать максимальную скорость машины. С его помощью обратиться ко второму объекту — двигателю.

Русский

2017-10-23

332.5 KB

0 чел.

Отчет

о лабораторной работе №6

по дисциплине «Объектно-ориентированное программирование»

на тему: «Паттерны проектирования»

Задание № 1 Вариант № 5.

Задача:

Создать абстрактную фабрику CarFactory, содержащую семейство из двух объектов — автомобиля и двигателя для него.

Реализовать две конкретные фабрики: первую - создающую класс, описывающий автомобиль BMW и двигатель для него, и вторую - для автомобиля марки Audi.

Описать абстрактный класс для автомобилей. В нем должен быть один метод, позволяющий узнать максимальную скорость машины. С его помощью обратиться ко второму объекту — двигателю.

Все двигатели, в свою очередь, должны содержать один параметр — максимальную скорость.

Реализовать класс для автомобиля BMW. А затем определить параметры его двигателя. Проделать то же самое для класса, описывающего автомобиль Audi.

Создать класс Client, где показать, как осуществляется работа с абстрактной фабрикой. В конструктор такого класса должны передаваться все конкретные фабрики, которые и начнут создавать объекты автомобиль и двигатель. Следовательно, в конструктор класса Client допустимо передать любую конкретную фабрику, работающую с любыми марками автомобилей. А метод Run должен позволить узнать максимальную скорость конкретной машины.

В методе Main() создать два объекта абстрактной фабрики.

Создать два екземпляра класса Client и вызвать метод Run для каждого экземпляра.

Спецификация программных требований

Формулировка

Продемонстрировать работу шаблона проектирования Абстрактная фабрика на примере фабрики по изготовлению машин

Входные данные

Отсутствуют

Обработка

Использование шаблона проектирования.

Выходные данные

Максимальная скорость машин.

Пользовательский интерфейс

Текст программы

C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ex1

{

abstract class CarFactory

{

public abstract AbstractCar CreateCar();

public abstract AbstractEngine CreateEngine();

}

class BMWFactory : CarFactory

{

public override AbstractCar CreateCar()

{

return new BMWCar();

}

public override AbstractEngine CreateEngine()

{

return new BMWEngine();

}

}

class AudiFactory : CarFactory

{

public override AbstractCar CreateCar()

{

return new AudiCar();

}

public override AbstractEngine CreateEngine()

{

return new AudiEngine();

}

}

abstract class AbstractCar

{

public abstract void MaxSpeed(AbstractEngine engine);

}

abstract class AbstractEngine

{

public int max_speed;

}

class BMWCar : AbstractCar

{

public override void MaxSpeed(AbstractEngine engine)

{

Console.WriteLine("Макcимальнаяскорость: " + engine.max_speed.ToString());

}

}

class BMWEngine : AbstractEngine

{

public BMWEngine()

{

max_speed = 200;

}

}

class AudiCar : AbstractCar

{

public override void MaxSpeed(AbstractEngine engine)

{

Console.WriteLine("Макcимальнаяскорость: " + engine.max_speed.ToString());

}

}

class AudiEngine : AbstractEngine

{

public AudiEngine()

{

max_speed = 180;

}

}

class Client

{

private AbstractCar abstractCar;

private AbstractEngine abstractEngine;

public Client(CarFactory car_factory)

{

abstractCar = car_factory.CreateCar();

abstractEngine = car_factory.CreateEngine();

}

public void Run()

{

abstractCar.MaxSpeed(abstractEngine);

}

}

class Program

{

static void Main(string[] args)

{

//Абстрактнаяфабрика № 1

CarFactory bmw_car = new BMWFactory();

Client c1 = new Client(bmw_car);

c1.Run();

//Абстрактнаяфабрика № 2

CarFactory audi_factory = new AudiFactory();

Client c2 = new Client(audi_factory);

c2.Run();

Console.Read();

}

}

}

Java

package javaex1;

/**

*

* @author Tatyana

*/

abstract class CarFactory {

public abstract AbstractCar createCar();

public abstract AbstractEngine createEngine();

}

class BMWFactory extends CarFactory {

@Override

public AbstractCar createCar() {

return new BMWCar();

}

@Override

public AbstractEngine createEngine() {

return new BMWEngine();

}

}

class AudiFactory extends CarFactory {

@Override

public AbstractCar createCar() {

return new AudiCar();

}

@Override

public AbstractEngine createEngine() {

return new AudiEngine();

}

}

abstract class AbstractCar {

public abstract void maxSpeed(AbstractEngine engine);

}

abstract class AbstractEngine {

public int max_speed;

}

class BMWCar extends AbstractCar {

@Override

public void maxSpeed(AbstractEngine engine) {

System.out.println("Макcимальнаяскорость: " + (new Integer(engine.max_speed)).toString());

}

}

class BMWEngine extends AbstractEngine {

public BMWEngine() {

max_speed = 200;

}

}

class AudiCar extends AbstractCar {

@Override

public void maxSpeed(AbstractEngine engine) {

System.out.println("Макcимальнаяскорость: " + (new Integer(engine.max_speed)).toString());

}

}

class AudiEngine extends AbstractEngine {

public AudiEngine() {

max_speed = 180;

}

}

class Client {

private AbstractCar abstractCar;

private AbstractEngine abstractEngine;

public Client(CarFactory car_factory) {

abstractCar = car_factory.createCar();

abstractEngine = car_factory.createEngine();

}

public final void run() {

abstractCar.maxSpeed(abstractEngine);

}

}

public class JavaEx1 {

/**

* @param args the command line arguments

*/

public static void main(String[] args) {

//Абстрактнаяфабрика № 1

CarFactory bmw_car = new BMWFactory();

Client c1 = new Client(bmw_car);

c1.run();

//Абстрактнаяфабрика № 2

CarFactory audi_factory = new AudiFactory();

Client c2 = new Client(audi_factory);

c2.run();

}

}

Результат работы программы

Краткие выводы по работе

За время выполнения лабораторной работы 6 я ознакомилась с принципом работы шаблона Абстрактная Фабрика.

Задание № 2 Вариант № 5.

Задача:

Используя рекомендованную литературу изучить один из порождающих шаблонов проектирования (по вариантам). Привести пример реализации этого шаблона на языках C# и Java

Вариант 5

строитель (builder);

Спецификация программных требований

Формулировка

Реализовать работу шаблона проектирования builder

Входные данные

Отсутствуют.

Обработка

Реализовать шаблон builder

Выходные данные

Характеристики игрушек.

Пользовательский интерфейс

Текст программы

C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Collections;

//Отделяет конструирование сложного объекта от его представления, так

//что в результате одного и того же процесса конструирования могут получаться разные представления.

namespace ex2

{

class Toy

{

//информация о игрушке

ArrayList toys = new ArrayList();

// добаление новой информации о игрушке

public void Add(string toy)

{

toys.Add(toy);

}

//вывод информации о игрушке

public void Show()

{

Console.WriteLine("\n\n\n\t* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");

Console.WriteLine(" \t\t\t\tИгрушка ");

Console.WriteLine("\t* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");

foreach (string part in toys)

Console.WriteLine(part);

}

}

// "Строитель — абстрактный интерфейс для создания объекта Toy по частям"

abstract class ToyBuilder

{

public abstract void name();

public abstract void material();

public abstract void age();

public abstract Toy GetToy();

}

//созданиеигрушкидлядевочек

class ToyForGirls : ToyBuilder

{

private Toy tfg = new Toy();

public override void name()

{

tfg.Add("\tНазваниеигрушки:Куклафеяскрылышками");

}

public override void material()

{

tfg.Add("\tМатериал:Пластик ");

}

public override void age()

{

tfg.Add("\tРазрешено играть детям возрастом от 3 лет");

}

public override Toy GetToy()

{

return tfg;

}

}

//строитель игрушки для мальчиков

class ToyForBoy : ToyBuilder

{

private Toy tfb = new Toy();

public override void name()

{

tfb.Add("\tНазваниеигрушки:Радиоуправляемаямашина «ПротоколФантом»");

}

public override void material()

{

tfb.Add("\tМатериал:Пластик ");

}

public override void age()

{

tfb.Add("\tРазрешено играть детям возрастом от 10 лет");

}

public override Toy GetToy()

{

return tfb;

}

}

//класс отвечающий за конструирование

//класс, занимающийся конструированием объекта, используя интерфейс, представленный Строителем;

class Shop

{

//создание игрушки по частям

public void Creation(ToyBuilder builder)

{

builder.name();

builder.material();

builder.age();

builder.GetToy();

}

}

class Program

{

public static void Main()

{

//класс Магазин

// и действие по созданию игрушек для девочек и мальчиков

Shop shop = new Shop();

ToyBuilder tfg = new ToyForGirls();

ToyBuilder tfb = new ToyForBoy();

//Создание игрушек для девочек и мальчиков

shop.Creation(tfg);

Toy t1 = tfg.GetToy();

t1.Show();

shop.Creation(tfb);

Toy t2 = tfb.GetToy();

t2.Show();

Console.WriteLine("\tДля выхода с программы нажмите любую клавишу!");

Console.Read();

}

}

}

Результат работы программы

Java

package javaex2;

/**

*

* @author Tatyana

*/

//bilder- строитель

//Отделяет конструирование сложного объекта от его представления, так

//что в результате одного и того же процесса конструирования могут получаться разные представления.

class Toy {

//информация о игрушке

private java.util.ArrayList toys = new java.util.ArrayList();

// добаление новой информации о игрушке

public final void add(String toy) {

toys.add(toy);

}

//вывод информации о игрушке

public final void show() {

System.out.println("\n\n\n\t* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");

System.out.println(" \t\t\t\tИгрушка ");

System.out.println("\t* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ");

for (int i = 0; i < toys.size(); i++) {

System.out.println(toys.get(i));

}

}

}

// "Строитель — абстрактный интерфейс для создания объекта Toy по частям"

abstract class ToyBuilder {

public abstract void name();

public abstract void material();

public abstract void age();

public abstract Toy getToy();

}

//созданиеигрушкидлядевочек

class ToyForGirls extends ToyBuilder {

private Toy tfg = new Toy();

@Override

public void name() {

tfg.add("\tНазваниеигрушки:Куклафеяскрылышками");

}

@Override

public void material() {

tfg.add("\tМатериал:Пластик ");

}

@Override

public void age() {

tfg.add("\tРазрешено играть детям возрастом от 3 лет");

}

@Override

public Toy getToy() {

return tfg;

}

}

//строительигрушкидлямальчиков

class ToyForBoy extends ToyBuilder {

private Toy tfb = new Toy();

@Override

public void name() {

tfb.add("\tНазвание игрушки: Радиоуправляемая машина «Протокол Фантом»");

}

@Override

public void material() {

tfb.add("\tМатериал:Пластик ");

}

@Override

public void age() {

tfb.add("\tРазрешено играть детям возрастом от 10 лет");

}

@Override

public Toy getToy() {

return tfb;

}

}

//класс отвечающий за конструирование

//класс, занимающийся конструированием объекта, используя интерфейс, представленный Строителем;

class Shop {

//создание игрушки по частям

public final void creation(ToyBuilder builder) {

builder.name();

builder.material();

builder.age();

builder.getToy();

}

}

public class JavaEx2 {

public static void main(String[] args) {

// и действие по созданию игрушек для девочек и мальчиков

Shop shop = new Shop();

ToyBuilder tfg = new ToyForGirls();

ToyBuilder tfb = new ToyForBoy();

//Создание игрушек для девочек и мальчиков

shop.creation(tfg);

Toy t1 = tfg.getToy();

t1.show();

shop.creation(tfb);

Toy t2 = tfb.getToy();

t2.show();

}

}

Результат работы программы

Краткие выводы по работе

За время выполнения лабораторной работы 6 я ознакомилась с принципом работы шаблона builder.

Задание № 3 Вариант № 5.

Задача:

Используя рекомендованную литературу изучить один из структурных шаблонов проектирования (по вариантам). Привести пример реализации этого шаблона на языках C# и Java

Вариант 5

Мост (Bridge)

Спецификация программных требований

Формулировка

Реализовать работу шаблона проектирования Bridge

Входные данные

Отсутствуют.

Обработка

Реализовать шаблон Bridge

Выходные данные

Отправка писем пользователям.

Пользовательский интерфейс

Текст программы

C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

//Мост (Bridge)

//Требуется отделить абстракцию от реализации так, чтобы и то и

//другое можно было изменять независимо. При использовании наследования

//реализация жестко привязывается к абстракции, что затрудняет независимую модификацию.

namespace ex3

{

class MainApp

{

static void Main()

{

Abstraction ab = new RefinedAbstraction();

ab.Implementor = new ConcreteImplementorA();

ab.Operation();

ab.Implementor = new ConcreteImplementorB();

ab.Operation();

Console.Read();

}

}

//класс "Абстракция" определяет операции более

//высокого уровня (интерфейсы абстракции),

//базирующиеся на этих примитивных

class Abstraction

{

protected Implementor implementor;

// Property

public Implementor Implementor

{

get

{

return implementor;

}

set

{

implementor = value;

}

}

public virtual void Operation()

{

implementor.Operation();

}

}

// Implementor - реализатор.

// не обязан соответсвовать интерфейсу класса абстракции.

//выплняетпримитивныеоперации

abstract class Implementor

{

public abstract void Operation();

}

// RefinedAbstraction - уточненная абстракция

// расширяет интерфейс, определенный абстракцией

class RefinedAbstraction : Abstraction

{

public override void Operation()

{

implementor.Operation();

}

}

// ConcreteImplementor - конкретный реализатор

//реалицация предоставляет примитивнце реализации

//отправкаписьмапоэлек.почте

class ConcreteImplementorA : Implementor

{

public override void Operation()

{

Console.WriteLine("Отправленнописьмопо Email");

}

}

//отправкаписьмапосмс

class ConcreteImplementorB : Implementor

{

public override void Operation()

{

Console.WriteLine("Отправленнописьмопо SMS");

}

}

}

Результат работы программы

Java

package javaex3;

/**

*

* @author Tatyana

*/

// Мост (Bridge)

//Требуется отделить абстракцию от реализации так, чтобы и то и

//другое можно было изменять независимо. При использовании наследования

//реализация жестко привязывается к абстракции, что затрудняет независимую модификацию.

public class JavaEx3 {

/**

* @param args the command line arguments

*/

public static void main(String[] args) {

Abstraction ab = new RefinedAbstraction();

ab.setImplementor(new ConcreteImplementorA());

ab.operation();

ab.setImplementor(new ConcreteImplementorB());

ab.operation();

}

}

//класс "Абстракция" определяет операции более

//высокого уровня (интерфейсы абстракции),

//базирующиеся на этих примитивных

class Abstraction {

protected Implementor implementor;

// Property

public final Implementor getImplementor() {

return implementor;

}

public final void setImplementor(Implementor value) {

implementor = value;

}

public void operation() {

implementor.operation();

}

}

// Implementor - реализатор.

// не обязан соответсвовать интерфейсу класса абстракции.

//выплняетпримитивныеоперации

abstract class Implementor {

public abstract void operation();

}

// RefinedAbstraction - уточненная абстракция

// расширяет интерфейс, определенный абстракцией

class RefinedAbstraction extends Abstraction {

@Override

public void operation() {

implementor.operation();

}

}

// ConcreteImplementor - конкретный реализатор

//реалицация предоставляет примитивнце реализации

//отправкаписьмапоэлек.почте

class ConcreteImplementorA extends Implementor {

@Override

public void operation() {

System.out.println("Отправленнописьмопо Email");

}

}

//отправкаписьмапосмс

class ConcreteImplementorB extends Implementor {

@Override

public void operation() {

System.out.println("Отправленнописьмопо SMS");

}

}

Результат работы программы

Краткие выводы по работе

За время выполнения лабораторной работы 6 я ознакомилась с принципом работы шаблона Bridge.

Задание № 4 Вариант № 5.

Задача:

Используя рекомендованную литературу изучить один из поведенческих шаблонов проектирования (по вариантам). Привести пример реализации этого шаблона на языках C# и Java.

Вариант 5

Посетитель (Visitor)

Формулировка

Реализовать работу шаблона проектирования Visitor

Входные данные

Отсутствуют.

Обработка

Реализовать шаблон Visitor

Выходные данные

Посетитель магазина. (стоимость к оплате, количество бесплатных дней)

Пользовательский интерфейс

Текст программы

C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ex4

{

//Шаблон Посетитель (Visitor) — поведенческий Шаблон проектирования.

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

//При изменении Visitor нет необходимости изменять обслуживаемые классы.

class MainApp

{

static void Main()

{

clients e = new clients();

e.Attach(new Client1());

e.Attach(new Client2());

e.Attach(new Client3());

e.Accept(new priceVisitor());

e.Accept(new FreeVisitor());

Console.ReadKey();

}

}

// The 'Visitor' interface

interface IVisitor

{

void Visit(Element element);

}

//конкрутный посетитель (стоимость)

class priceVisitor : IVisitor

{

public void Visit(Element element)

{

client client = element as client;

Console.WriteLine("{0} {1}долженоплатить: {2:C}",

client.GetType().Name, client.Name,

client.price);

}

}

//конкрутный посетитель (количество дней бесплатно)

class FreeVisitor : IVisitor

{

public void Visit(Element element)

{

client client = element as client;

Console.WriteLine("{0} {1}бесплатныхдней: {2} ",

client.GetType().Name, client.Name,

client.free);

}

}

//абстрактыйкласс

abstract class Element

{

public abstract void Accept(IVisitor visitor);

}

// класс конкретного объека

class client : Element

{

private string _name;

private double _price;

private int _free;

//Конструктор

public client(string name, double price, int free)

{

this._name = name;

this._price = price;

this._free = free;

}

//свойства

//имя

public string Name

{

get

{

return _name;

}

set

{

_name = value;

}

}

//цена

public double price

{

get

{

return _price;

}

set

{

_price = value;

}

}

//количетсвобесплытныхдней

public int free

{

get

{

return _free;

}

set

{

_free = value;

}

}

public override void Accept(IVisitor visitor)

{

visitor.Visit(this);

}

}

//структура объекта (класс)

class clients

{

private List<client> _clients = new List<client>();

public void Attach(client client)

{

_clients.Add(client);

}

public void Detach(client client)

{

_clients.Remove(client);

}

public void Accept(IVisitor visitor)

{

foreach (client e in _clients)

{

e.Accept(visitor);

}

Console.WriteLine();

}

}

//тритипаклиентов

class Client1 : client

{

//Конструктор

public Client1()

: base("Ирина", 250.0, 3)

{

}

}

class Client2 : client

{

//Конструктор

public Client2()

: base("Константин", 350.0, 1)

{

}

}

class Client3 : client

{

//Конструктор

public Client3()

: base("Денис", 450.0, 2)

{

}

}

}

Результат работы программы

Java

/*

* To change this template, choose Tools | Templates

* and open the template in the editor.

*/

package javaex4;

/**

*

* @author Tatyana

*/

public class JavaEx4 {

//Шаблон Посетитель (Visitor) — поведенческий Шаблон проектирования.

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

//При изменении Visitor нет необходимости изменять обслуживаемые классы.

/**

*

* @param args

*/

public static void main(String[] args) {

clients e = new clients();

e.attach(new Client1());

e.attach(new Client2());

e.attach(new Client3());

e.accept(new priceVisitor());

e.accept(new FreeVisitor());

}

}

// The 'Visitor' interface

interface IVisitor {

void visit(Element element);

}

//конкрутный посетитель (стоимость)

class priceVisitor implements IVisitor {

@Override

public final void visit(Element element) {

client client = (client) ((element instanceof client) ? element : null);

System.out.printf(client.getClass().getName() + " " + client.getName() + "долженоплатить: " + client.getprice() + "\r\n");

}

}

//конкрутный посетитель (количество дней бесплатно)

class FreeVisitor implements IVisitor {

public final void visit(Element element) {

client client = (client) ((element instanceof client) ? element : null);

System.out.printf(client.getClass().getName() + " " + client.getName() + "бесплатныхдней:: " + client.getfree() + "\r\n");

}

}

//абстрактыйкласс

abstract class Element {

public abstract void accept(IVisitor visitor);

}

//классконкретногообъека

class client extends Element {

private String _name;

private double _price;

private int _free;

//Конструктор

client(String name, double price, int free) {

this._name = name;

this._price = price;

this._free = free;

}

//свойства

//имя

final String getName() {

return _name;

}

final void setName(String value) {

_name = value;

}

//цена

final double getprice() {

return _price;

}

final void setprice(double value) {

_price = value;

}

//количетсвобесплытныхдней

final int getfree() {

return _free;

}

final void setfree(int value) {

_free = value;

}

@Override

public void accept(IVisitor visitor) {

visitor.visit(this);

}

}

//структура объекта (класс)

class clients {

private java.util.ArrayList<client> _clients = new java.util.ArrayList<client>();

final void attach(client client) {

_clients.add(client);

}

final void detach(client client) {

_clients.remove(client);

}

final void accept(IVisitor visitor) {

for (client e : _clients) {

e.accept(visitor);

}

System.out.println();

}

}

//тритипаклиентов

class Client1 extends client {

//Конструктор

Client1() {

super("Ирина", 250.0, 3);

}

}

class Client2 extends client {

//Конструктор

Client2() {

super("Константин", 350.0, 1);

}

}

class Client3 extends client {

//Конструктор

public Client3() {

super("Денис", 450.0, 2);

}

}

Результат работы программы

Краткие выводы по работе

За время выполнения лабораторной работы 6 я ознакомилась с принципом работы шаблона Visitor.


 

А также другие работы, которые могут Вас заинтересовать

57663. Спорт і спортивні ігри 93.5 KB
  Today we will speak about sports and sport games. We are going to refresh your knowledge of the names of sports. You will be able to guess a crossword.
57664. Спорт в нашому житті. Sport in our life 61 KB
  Alec plays football very well. He is a member of the school football team. Last year their team won the first place. They became champions and got prize. So this year they will try to play well too.
57665. Popular Sports and Games. Ukrainian Sportsmen 39.5 KB
  Good morning, dear children. I am very glad to see you today. How are you? Are you ready to speak English? So, today we will speak on the topic “Popular sports and games. Ukrainian sportsmen.”
57666. Music styles 114 KB
  Today we’ll have an unusual beginning of the lesson. Look at the blackboard and read the dialogue with roles of your groups. (Using jazz dialogues by roles of two groups)
57667. Teenagers. Their problems and activities 95.5 KB
  Good morning to everyone. Welcome to our English class. Today we will speak about the problems of teenagers. Youth is a very important period in the life of a man. This is a time when a person discovers the world and tries to determine their place in the universe.
57668. Моє рідне місто 100 років тому 61.5 KB
  One representative from each group will come here and assist me in finding the correct name a)turn left: b) go as far as; c) cross the bridge; d) take the first turning right; e) take the second turning left...
57669. Transportation and Public Transit 547 KB
  Pupils, today we take cars, trains, airplanes and power boats for granted. But we haven’t always had them. People have lived on earth for millions of years. But until a few hundred years ago, there weren’t that many ways to get aroun
57670. The More We Travel The More We Know 168.5 KB
  We shall learn a lot of interesting information about history, sights, customs and leisure. We’ll speak, work with presentations, listen to the text, read, make up a dialogue. At the end of the lesson you must give the answers to the question “Why do the people travel?”
57671. Жизнь общества. Повторение грамматики 1.33 MB
  Цели урока (разрабатываются совместно с учениками): Повторить грамматический материал The Present Simple (Indefinite) Tense; Изучить и первично закрепить грамматический материал The Present Simple (Indefinite) Passive Voice...