0

私はこのパターンをコードで時々使用しますが、それが良いのか、悪いのか、名前があるのか​​さえ疑問に思っています。問題を解決するために一般的に使用されるパターンであるかどうかを確認するためにいくつかの調査を行いましたが、何も見つからないようです。それが私に役立つのは、あまりにも多くの同僚やピアオブジェクトが記憶の知識を利用できないようにすることです. 例がそれを最もよく説明していると思います。

プレイヤーがインベントリを持っているゲームがあるとします。インベントリにはアイテムがあり、各アイテムには databaseId があるため、同じアイテムの 2 つのコピーが単純に同じデータベース エントリを指すことができます。何かがプレーヤーのインベントリからアイテムを取得する必要がある場合、アイテム自体の明示的な知識はなく、削除する必要があるアイテム DB ID を知っているだけです。さらに、アイテムはクライアント ユーザー インターフェイスに使用される handleId (一意) によって格納されます (一意のハンドルがインターフェイスに渡されるため、UIItem は基本的に一種のコールバック ID を持ちます)。

疑似コード:

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.

現在、UI がアイテムを削除したい場合 (つまり、プレイヤーがアイテムをゴミ箱にドラッグした場合)、知識を分離する public メソッドがあります。NPC がアイテムを削除したい場合 (NPC がプレイヤーに触れたときに盗み、特定の ItemId を探しているとしましょう)、知識を分離する public メソッドも持っています。

私の質問はまず、このパターンには名前がありますか、それとも私が見ていない別のパターンの変数ですか? 第二に、これは良い習慣ですか、それとも悪い習慣ですか? 私にとっては良いのですが、何かが足りないかもしれません。

4

1 に答える 1

3

私にはFlyweight パターンのかなり教科書的な例のように見えます。

flyweight は、他の同様のオブジェクトとできるだけ多くのデータを共有することによって、メモリの使用を最小限に抑えるオブジェクトです。これは、単純な反復表現が容認できない量のメモリを使用する場合に、多数のオブジェクトを使用する方法です。多くの場合、オブジェクトの状態の一部を共有できます。これらを外部データ構造に保持し、使用時に一時的に flyweight オブジェクトに渡すのが一般的な方法です。

于 2013-10-07T21:58:52.607 に答える