- •Вступление
- •Порождающие шаблоны проектирования
- •Использование
- •Перечень порождающих шаблонов
- •Абстрактная фабрика — Абстрактная фабрика
- •Цель
- •Плюсы
- •Минусы
- •Применимость
- •Структура
- •Пример реализации
- •Builder — Строитель
- •Цель
- •Плюсы
- •Применение
- •Структура
- •Пример реализации
- •Factory method — Фабричный метод
- •Цель
- •Структура
- •Плюсы
- •Минусы
- •Пример реализации
- •Lazy initialization — Ленивая инициализация
- •Достоинства
- •Недостатки
- •Пример реализации
- •Object pool — Объектный пул
- •Применение
- •Переполнение
- •Примеры
- •Ловушки
- •Пример реализации
- •Prototype — Прототип
- •Назначение
- •Применимость
- •Структура
- •Пример реализации
- •Singleton — Одиночка
- •Цель
- •Плюсы
- •Минусы
- •Применение
- •Структура
- •Пример реализации
- •Double checked locking - Блокировка с двойной проверкой
- •Пример реализации
- •Структурные шаблоны проектирования
- •Использование
- •Перечень структурных шаблонов
- •Front Controller — Входная точка
- •Пример
- •Структура
- •Adapter — Адаптер
- •Задача
- •Способ решения
- •Участники
- •Структура
- •Следствия
- •Реализация
- •Пример реализации
- •Bridge — Мост
- •Цель
- •Структура
- •Описание
- •Использование
- •Пример реализации
- •Composite — Компоновщик
- •Цель
- •Структура
- •Пример реализации
- •Decorator — Декоратор
- •Задача
- •Способ решения
- •Участники
- •Следствия
- •Реализация
- •Замечания и комментарии
- •Применение шаблона
- •Структура
- •Пример реализации
- •Facade — Фасад
- •Структура
- •Проблема
- •Решение
- •Особенности применения
- •Пример реализации
- •Flyweight — Приспособленец
- •Цель
- •Описание
- •Сруктура
- •Пример реализации
- •Proxy — Заместитель
- •Проблема
- •Решение
- •Структура
- •Преимущества
- •Недостатки
- •Сфера применения
- •Прокси и близкие к нему шаблоны
- •Пример реализации
- •Поведенческие шаблоны проектирования
- •Использование
- •Перечень поведенческий шаблонов
- •Chain of responsibility — Цепочка обязанностей
- •Применение
- •Сруктура
- •Пример реализации
- •Command — Команда
- •Цель
- •Описание
- •Сруктура
- •Пример реализации
- •Interpreter — Интерпретатор
- •Проблема
- •Решение
- •Преимущества
- •Недостатки
- •Пример
- •Структура
- •Пример реализации
- •Iterator — Итератор
- •Структура
- •Пример реализации
- •Mediator — Посредник
- •Проблема
- •Решение
- •Преимущества
- •Структура
- •Описание
- •Пример реализации
- •Memento — Хранитель
- •Применение
- •Структура
- •Описание
- •Пример реализации
- •Observer — Наблюдатель
- •Назначение
- •Структура
- •Область применения
- •Пример реализации
- •State — Состояние
- •Структура
- •Пример реализации
- •Strategy — Стратегия
- •Задача
- •Мотивы
- •Способ решения
- •Участники
- •Следствия
- •Реализация
- •Полезные сведения
- •Использование
- •Сруктура
- •Пример реализации
- •Template — Шаблонный метод
- •Применимость
- •Участники
- •Сруктура
- •Пример реализации
- •Visitor — Посетитель
- •Структура
- •Описание средствами псевдокода
- •Проблема
- •Решение
- •Рекомендации
- •Преимущества
- •Недостатки
- •Пример реализации
- •Null Object (Null object)
- •Мотивация
- •Описание
- •Структура
- •Реализация
- •Пример
- •Связь с другими патернами
- •Критика и комментарии
- •Пример реализации
- •Слуга (Servant)
- •Описание
- •Структура
- •Реализаци
- •Пример реализации
- •Specification (Specification)
- •Структура
- •Пример реализации
- •Пример использования
- •Simple Policy
- •Обзор
- •Простыми словами
- •Сруктура
- •Пример реализации
- •Single-serving visitor
- •Применение
- •Пример использования
- •Плюси
- •Минусы
- •Пример реализации
- •Об авторе
Flyweight — Приспособленец
Приспособленец (англ. Flyweight) — это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым.
Цель
Оптимизация работы с памятью, путем предотвращения создания экземпляров элементов, имеющих общую сущность.
Описание
Flyweight используется для уменьшения затрат при работе с большим количеством мелких объектов. При проектировании приспособленца необходимо разделить его свойства на внешние и внутренние. Внутренние свойства всегда неизменны, тогда как внешние могут отличаться в зависимости от места и контекста применения и должны быть вынесены за пределы приспособленца.
Flyweight дополняет паттерн Factory таким образом, что Factory при обращении к ней клиента для создания нового объекта ищет уже созданный объект с такими же параметрами, что и у требуемого, и возвращает его клиенту. Если такого объекта нет, то фабрика создаст новый.
Сруктура
Пример реализации using System;
using System.Collections;
namespace Flyweight
{
class MainApp
{
static void Main()
{
// Build a document with text string document = "AAZZBBZB";
char[] chars = document.ToCharArray();
CharacterFactory f = new CharacterFactory();
// extrinsic state int pointSize = 10;
57
//For each character use a flyweight object foreach (char c in chars)
{
pointSize++;
Character character = f.GetCharacter(c); character.Display(pointSize);
}
//Wait for user
Console.Read();
}
}
// "FlyweightFactory"
class CharacterFactory
{
private Hashtable characters = new Hashtable();
public Character GetCharacter(char key)
{
// Uses "lazy initialization"
Character character = characters[key] as Character; if (character == null)
{
switch (key)
{
case 'A':
character = new CharacterA(); break;
case 'B':
character = new CharacterB(); break;
//...
case 'Z':
character = new CharacterZ(); break;
}
characters.Add(key, character);
}
return character;
}
}
// "Flyweight"
abstract class Character
{
protected char symbol; protected int width; protected int height; protected int ascent; protected int descent; protected int pointSize;
public abstract void Display(int pointSize);
}
// "ConcreteFlyweight"
class CharacterA : Character
{
// Constructor public CharacterA()
{
58
this.symbol = 'A'; this.height = 100; this.width = 120; this.ascent = 70; this.descent = 0;
}
public override void Display(int pointSize)
{
this.pointSize = pointSize; Console.WriteLine(this.symbol +
" (pointsize " + this.pointSize + ")");
}
}
// "ConcreteFlyweight"
class CharacterB : Character
{
// Constructor public CharacterB()
{
this.symbol = 'B'; this.height = 100; this.width = 140; this.ascent = 72; this.descent = 0;
}
public override void Display(int pointSize)
{
this.pointSize = pointSize; Console.WriteLine(this.symbol +
" (pointsize " + this.pointSize + ")");
}
}
//... C, D, E, etc.
//"ConcreteFlyweight"
class CharacterZ : Character
{
// Constructor public CharacterZ()
{
this.symbol = 'Z'; this.height = 100; this.width = 100; this.ascent = 68; this.descent = 0;
}
public override void Display(int pointSize)
{
this.pointSize = pointSize; Console.WriteLine(this.symbol +
" (pointsize " + this.pointSize + ")");
}
}
}
59