Я иногда использую этот шаблон в коде, и мне интересно, хорошо ли оно, плохо или даже имеет имя. Я провел некоторое исследование, чтобы узнать, является ли он часто используемым шаблоном для решения проблем, но не может ничего найти. То, что мне помогает, - это предотвращение доступа к памяти из-за слишком большого количества коллег или одноранговых объектов. Я думаю, что пример лучше всего описал бы его.
Предположим, у меня есть игра, в которой у игрока есть инвентарь. В инвентаре есть элементы, и каждый элемент имеет базу данных, поэтому две копии одного и того же элемента могут просто указывать на одну и ту же запись в базе данных. Когда что-то нужно взять из инвентаря игрока, они не имеют явного знания самого элемента, а вместо этого просто знают, какой идентификатор элемента БД им нужно удалить. Кроме того, элементы хранятся в их handleId (уникальном), который используется для клиентских пользовательских интерфейсов (уникальный дескриптор передается интерфейсу, так что UIItem в основном имеет своего рода идентификатор обратного вызова)
Псевдопользователей-код:
class Inventory
Map<int, Item> m_Items;
public:
bool RemoveItem(int dbItemId, int count)
{
Item* pItem = GetItemByDBId(dbItemId);
if (pItem) { return RemoveItem( pItem, count); }
return false
}
bool RemoveItem(int handle, count)
{
Item* pItem = m_Items.Find(handle); //Find in my Map returns a const pointer.
if (pItem) { return RemoveItem( pItem, count); }
return false;
}
private:
bool RemoveItem(Item* item, int count); //Handles logic of removing, removes, and returns true if the remove succeeds (ie, quest items can't be removed, etc)
Item* GetItemByHandle(int handle); //returns the item in the map by handle, null if not found
Item* GetItemByDBId(int dbId); //returns the first item with this dbId, null if not found.
Теперь, если пользовательский интерфейс хочет удалить элемент (т.е. Игрок перетащил его в мусорный ящик), существует общедоступный метод, который отделяет знания. Если NPC хочет удалить элемент (просто скажите, что NPC ворует, когда он касается игрока, и ищет определенный ItemId), тогда он также имеет открытый метод, который отделяет знания.
Мой вопрос, во-первых, имеет ли этот шаблон имя, или это переменная другого шаблона, который я не вижу? Во-вторых, это хорошая практика или плохая практика? Для меня это хорошо, но я мог бы что-то упустить.
Похоже, я похож на пример учебника по методу Flyweight.
Мухи - это объект, который минимизирует использование памяти путем совместного использования как можно большего количества данных с другими подобными объектами; это способ использовать объекты в больших количествах, когда простое повторное представление будет использовать недопустимый объем памяти. Часто некоторые части состояния объекта могут быть разделены, и распространенная практика заключается в том, чтобы удерживать их во внешних структурах данных и временно передавать их на объекты мухи, когда они используются.