Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы / Лабораторная работа 2 / ПКРПСиБД LAB2 Бочаров И.А..docx
Скачиваний:
22
Добавлен:
28.06.2014
Размер:
276.11 Кб
Скачать

Национальный исследовательский институт

Московский Энергетический Институт (Технический Университет)

Институт автоматики и вычислительной техники

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

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

по дисциплине:

Проектирование крупных распределенных программных систем и баз данных

тема: «Реализация шаблона проектирования»

Выполнил:

Бочаров Иван Андреевич

Проверил:

к.т.н., доц. Куриленко Иван Евгеньевич

Москва

2012 г.

Шаблон проектирования «Неизменяемый объект»

Категория шаблона

Данный шаблон относится к категории фундаментальных.

Описание

Неизменяемый объект - это такой объект, чье внешнее видимое состояние не может измениться после его создания. 

Примером таких объектов могут служить строки в Java, C#, VB.NET и Python. Так, операции изменения строки приводят к созданию нового объекта строки и разрушению старого.

Уместность применения

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

Неизменяемые классы идеальны для представления значения абстрактных типов данных, таких как числа, перечислимые типы или цвета. Основные числовые классы в библиотеке классов Java, такие как Integer, Long и Float - неизменяемые, так же как и стандартные числовые типы, такие как BigInteger и BigDecimal. Классам для представления сложных чисел или рациональных чисел произвольной точности лучше обладать неизменяемостью. В зависимости от вашего приложения даже абстрактные типы, которые содержат много дискретных значений, таких как векторы или матрицы, могли бы применяться как неизменяемые классы.

Преимущества, достигаемые при применении шаблона

Неизменяемые классы при правильном использовании могут значительно упростить программирование. Они могут находиться только в одном состоянии, поэтому, если они правильно сконструированы, они никак не могут быть в несогласованном состоянии. Можно:

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

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

  • из неизменяемых классов обычно получаются лучшие map key

Недостатки шаблона

Зачастую неизменяемость объектов приводит к тому, что, вместо того, чтобы внести малое, локальное изменение в объект, приходится создавать его копию. В некоторых случаях это выглядит довольно странно и может стать узким местом в производительности системы. По этой причине часто в библиотеках присутствует и изменяемая альтернатива неизменяемому объекту (StringBuilderиStringв языкеC#, например).

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

ImmutableObject.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Patterns

{

public class ImmutableObject

{

readonly int int_field;

readonly List<string> names;

public ImmutableObject(int field, List<string> names) {

this.int_field = field;

this.names = names;

}

public int IntegerField {

get { return this.int_field; }

}

public List<string> Names {

get { return new List<string>(this.names); }

}

}

}

}

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Patterns;

namespace ImmutableObjectTest

{

class Program

{

static void Main(string[] args)

{

ImmutableObject ImmutableObj = new ImmutableObject(10, new List<string>(new string[]{"John","Anthony","Michael","Chad"}));

Console.WriteLine(ImmutableObj.IntegerField.ToString());

Console.WriteLine("RHCP:");

foreach (string name in ImmutableObj.Names) {

Console.WriteLine(name);

}

ImmutableObj.Names[2] = "Toast";

Console.WriteLine("RHCP:");

foreach (string name in ImmutableObj.Names)

{

Console.WriteLine(name);

}

Console.ReadLine();

}

}

}