Лабораторная работа 3 (ПКРПСиБД LAB3 Моисеев Н.А.)

Посмотреть архив целиком

НИУ Московский Энергетический Институт


Кафедра прикладной математики











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

дисциплине: «Распределённые информационные системы и

базы данных»


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











Студент:

Моисеев Н.А.

Группа:

А-13-07

Преподаватель:

Куриленко И.Е.











Москва 2012

Абстрактная фабрика.

Описание

Абстрактная фабрика (англ. Abstract factory) — порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение.

Применение

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Преимущества

  • Изолирует конкретные классы;

  • Упрощает замену семейств продуктов;

  • Гарантирует сочетаемость продуктов

Недостатки

  • Сложно добавить поддержку нового вида продуктов.

Детали реализации

public abstract class UnitAbstractFactory

{

public abstract IProductive CreateProductive(int x, int y);

public abstract IWorker CreateWorker();

public abstract IWarrior CreateWarrior();

}


public class GnomeFactory : UnitAbstractFactory

{

public GnomeFactory()

{

Console.WriteLine();

Console.WriteLine("============================");

Console.WriteLine("Move gnomes:");

Console.WriteLine();

}


public override IProductive CreateProductive(int x, int y)

{

return new Mine(x, y);

}


public override IWorker CreateWorker()

{

return new Miner();

}


public override IWarrior CreateWarrior()

{

return new Axer();

}

}


public class HumanFactory : UnitAbstractFactory

{

public HumanFactory()

{

Console.WriteLine();

Console.WriteLine("============================");

Console.WriteLine("Move humans:");

Console.WriteLine();

}


public override IProductive CreateProductive(int x, int y)

{

return new Ferma(x, y);

}


public override IWorker CreateWorker()

{

return new Fermer();

}


public override IWarrior CreateWarrior()

{

return new Knight();

}

}


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


Фабричный метод

Описание

Фабричный метод (англ. Factory Method) — порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса. В момент создания наследники могут определить, какой класс создавать. Иными словами, Фабрика делегирует создание объектов наследникам родительского класса.

Применение

Используется, когда:

  • Классу заранее неизвестно, объекты каких подклассов ему нужно создавать.

  • Класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.

  • Класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.

Преимущества

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

  • позволяет установить связь между параллельными иерархиями классов.

Недостатки

  • необходимость создавать наследника для каждого нового типа продукта.

Детали реализации

public abstract class GameObject

{

protected GameObject()

{

Console.WriteLine("Create " + GetType().Name);

}

}


public class Unit : GameObject

{

}


public class Terrain : GameObject

{

}




public abstract class Creator

{

public abstract GameObject FactoryMethod();

}


public class UnitCreator : Creator

{

public override GameObject FactoryMethod()

{

return new Unit();

}

}


public class TerrainCreator : Creator

{

public override GameObject FactoryMethod()

{

return new Terrain();

}

}


class Program

{

static void Main()

{

var creators = new Creator[] {new UnitCreator(), new TerrainCreator()};


foreach (var gameObject in creators.Select(creator =>

creator.FactoryMethod()))

{

}


Console.ReadLine();

}

}

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



Отложенная инициализация


Описание

Приём в программировании, когда некоторая ресурсоёмкая операция (создание объекта, вычисление значения) выполняется непосредственно перед тем, как будет использован её результат. Таким образом, инициализация выполняется «по требованию», а не заблаговременно.

Применение

Частный случай ленивой инициализации — создание объекта в момент обращения к нему — является одним из порождающих шаблонов проектирования. Как правило, он используется в сочетании с такими шаблонами как Фабричный метод, Одиночка и Заместитель.


Преимущества

  • Инициализация выполняется только в тех случаях, когда она действительно необходима;

  • Ускоряется начальная инициализация.

Недостатки

  • Невозможно явным образом задать порядок инициализации объектов;

  • Возникает задержка при первом обращении к объекту.

Детали реализации

public class LazyInitializator where T : new()

{

protected LazyInitializator()

{

}


private static T _instance;

public static T Instance

{

get

{

if (_instance == null)

{

lock (typeof(T))

{

if (_instance == null)

_instance = new T();

}

}

return _instance;

}

}

}


public sealed class BigObject : LazyInitializator<BigObject>

{

public BigObject()

{

//Большая работа

System.Threading.Thread.Sleep(3000);

System.Console.WriteLine("Экземпляр BigObject создан");

}

}






class Program

{

static void Main()

{

Console.WriteLine("Первое обращение к экземпляру BigObject...");


//создание объекта происходит только при этом обращении к объекту

Console.WriteLine(BigObject.Instance);


Console.WriteLine("Второе обращение к экземпляру BigObject...");

Console.WriteLine(BigObject.Instance);


//окончание программы

Console.ReadLine();

}

}

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


Объектный пул

Описание

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

Преимущества

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

Недостатки

  • После того, как объект возвращён, он должен вернуться в состояние, пригодное для дальнейшего использования. Если объекты после возвращения в пул оказываются в неправильном или неопределённом состоянии, такая конструкция называется объектной клоакой (англ. object cesspool).

  • Повторное использование объектов также может привести к утечке информации. Если в объекте есть секретные данные (например, номер кредитной карты), после освобождения объекта эту информацию надо затереть.

Детали реализации

public class Reusable

{

public Object[] Objs { get; protected set; }


public Reusable(params Object[] objs)

{

Objs = objs;

}

}


public class Creator : ICreation<Reusable>

{

private static Int32 _id;


public Reusable Create()

{

++_id;

return new Reusable(_id);

}

}


public class ReusablePool : ObjectPool<Reusable>

{

public ReusablePool()

: base(new Creator(), 2)

{


}

}


class Program

{

static void Main()

{

Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name);

var reusablePool = new ReusablePool();


var thrd1 = new Thread(Run);

var thrd2 = new Thread(Run);

var thisObject1 = reusablePool.GetObject();

var thisObject2 = reusablePool.GetObject();

thrd1.Start(reusablePool);

thrd2.Start(reusablePool);


ViewObject(thisObject1);

ViewObject(thisObject2);

Thread.Sleep(2000);

reusablePool.Release(thisObject1);

Thread.Sleep(2000);






Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.