- •Часть 1-3
- •2012 Лабораторная работа №3
- •Общие сведения
- •Формализация задачи
- •Упражнение 3 – Добавление в модель хранимой процедуры
- •Часть 1-4
- •2012 Лабораторная работа 4
- •Назначение паттерна Observer
- •Решаемая проблема
- •Назначение паттерна Singleton
- •Описание паттерна Singleton
- •Ход лабораторной работы Упражнение 1 - паттерн наблюдатель
- •Упражнение 2 - паттерн одиночка
- •Упражнение 3 - паттерн интерфейс
Упражнение 2 - паттерн одиночка
Собираем код из задания и реализуем его.
namespace Singleton
{
public class Singleton
{
protected static int name = 0;
protected Singleton()
{
name += 1;
Console.WriteLine("Singleton has been planted");
}
public static Singleton Instance
{
get { return SingletonCreator.Instance; }
}
public string getName
{
get { return name.ToString(); }
}
private sealed class SingletonCreator
{
private static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get { return SingletonCreator.instance; }
}
}
}
}
Откомпилировали код и запускаем программу.
Результат:
Рис. 7
Реализуем паттерн Одиночка по стандартной схеме:
class Singleton
{
private static Singleton _instance = null;
private static int count = 0;
private Singleton()
{
count += 1;
}
public static Singleton GetInstance()
{
if (_instance == null)
{
_instance = new Singleton();
}
Console.Write(count.ToString() + " ");
return _instance;
}
public string Count { get { return count.ToString(); } }
}
Далее реализуем класс без применения паттерна Одиночка для сравнения результатов работы:
class NotSingleton
{
private static int count = 0;
public NotSingleton()
{
count += 1;
Console.Write(count.ToString() + " ");
}
public string Count { get { return count.ToString(); } }
}
Используем код согласно заданию:
class MainClass
{
static void Main(string[] args)
{
List<Singleton> singletonList = new List<Singleton>();
List<NotSingleton> notSingletonList = new List<NotSingleton>();
for (int i = 0; i < 10; ++i)
{
singletonList.Add(Singleton.GetInstance());
}
Console.WriteLine();
for (int i = 0; i < 10; ++i)
{
notSingletonList.Add(new NotSingleton());
}
Console.ReadKey();
}
}
Результат работы программы:
Рис. 8. Результат задания
Упражнение 3 - паттерн интерфейс
Создаём интерфейсы FlyBehaviorиQuackBehavior:
namespace DesignPatternsLab
{
interface FlyBehavior
{
void fly();
}
}
namespace DesignPatternsLab
{
interface QuackBehavior
{
void quack();
}
}
Реализуем «поведение», используя интерфейсы:
Файл Fly.cs(Реализация полета)
namespace DesignPatternsLab
{
class FlyWithWings : FlyBehavior
{
public void fly()
{
System.Console.WriteLine("I can fly");
}
}
class FlyNoWay : FlyBehavior
{
public void fly()
{
System.Console.WriteLine("I can`t fly");
} }}
Файл Quack.cs(Реализация кряканья)
namespace DesignPatternsLab
{
class Quack : QuackBehavior
{
public void quack()
{
System.Console.WriteLine("Quack");
} }
class Slience : QuackBehavior
{
public void quack()
{
System.Console.WriteLine("Silence");
}
}
}
Базовый класс Duck:
class Duck
{
protected FlyBehavior flybehavior;
protected QuackBehavior quackbehavior;
public Duck() { }
public void performFly()
{
flybehavior.fly(); }
public void performQuack()
{
quackbehavior.quack();
}
public void swim() { } }
Изменяем класс Duck
class MallardDuck : Duck
{
public MallardDuck()
{
quackbehavior = new Quack();
flybehavior = new FlyWithWings(); // не может летать!
System.Console.WriteLine("I MallardDuck");
} }
По заданию создали класс WoodDuck
class WoodDuck : Duck
{
public WoodDuck()
{
quackbehavior = new Slience(); // деревянная утка не издает звуков
flybehavior = new FlyNoWay(); // и не летает
System.Console.WriteLine("I WoodDuck");
} }
Итоговый код:
class MainClass
{static void Main(string[] args)
{
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck wood = new WoodDuck();
wood.performQuack();
wood.performFly();
System.Console.ReadKey();
}}
Результат тестирования программы:
Рис. 9. Результат работы паттерна Интерфейс
Вывод: в ходе лабораторной работы ознакомились с применением некоторых паттернов проектирования: паттерн Интерфейс, паттерн Наблюдатель, паттерн Одиночка.
Использование паттернов позволяет снизить число связей между объектами и способствует простоте расширения кода.