`

[结构型模式] 享元模式的理解

 
阅读更多



头文件
//FlyweightPattern.h

#ifndef FLYWEIGHT_PATTERN_H
#define FLYWEIGHT_PATTERN_H

#include <Windows.h>
#include <iostream>
#include <map>
#include <vector>
using namespace std;

namespace FlyweightPattern
{
    typedef struct pointTag
    {
        int x;
        int y;

        pointTag(){}
        pointTag(int a, int b)
        {
            x = a;
            y = b;
        }

        bool operator <(const pointTag& other) const
        {
            if (x < other.x)
            {
                return true;
            }
            else if (x == other.x)
            {
                return y < other.y;
            }

            return false;
        }
    }POINT;

    typedef enum PieceColorTag
    {
        BLACK,
        WHITE
    }PIECECOLOR;

    class CPiece
    {
    public:
        CPiece(PIECECOLOR color);
        PIECECOLOR GetColor();

        // Set the external state
        void SetPoint(POINT point);
        POINT GetPoint();

    protected:
        // Internal state
        PIECECOLOR m_color;

        // external state
        POINT m_point;
    };

    class CGomoku : public CPiece
    {
    public:
        CGomoku(PIECECOLOR color);
    };

    class CPieceFactory
    {
    public:
        CPiece *GetPiece(PIECECOLOR color);

        ~CPieceFactory();

    private:
        vector<CPiece *> m_vecPiece;
    };

    class CChessboard
    {
    public:
        void Draw(CPiece *piece);
        void ShowAllPieces();

    private:
        map<POINT, CPiece *> m_mapPieces;
    };

    //////////////////////////////////////////////////////////////////////////
    void FlyweightPattern_Test();
}

#endif

实现
#include "FlyweightPattern.h"

namespace FlyweightPattern
{
    CPiece::CPiece(PIECECOLOR color)
        : m_color(color)
    {}

    PIECECOLOR CPiece::GetColor()
    {
        return m_color;
    }

    // Set the external state
    void CPiece::SetPoint(POINT point)
    {
        m_point = point;
    }

    POINT CPiece::GetPoint()
    {
        return m_point;
    }


    //////////////////////////////////////////////////////////////////////////
    CGomoku::CGomoku(PIECECOLOR color)
        : CPiece(color)
    {}


    //////////////////////////////////////////////////////////////////////////
    CPiece* CPieceFactory::GetPiece(PIECECOLOR color)
    {
        CPiece *pPiece = NULL;
        if (m_vecPiece.empty())
        {
            pPiece = new CGomoku(color);
            m_vecPiece.push_back(pPiece);
        }
        else
        {
            for (vector<CPiece *>::iterator it = m_vecPiece.begin(); it != m_vecPiece.end(); ++it)
            {
                if ((*it)->GetColor() == color)
                {
                    pPiece = *it;
                    break;
                }
            }
            if (pPiece == NULL)
            {
                pPiece = new CGomoku(color);
                m_vecPiece.push_back(pPiece);
            }
        }
        return pPiece;
    }    

    CPieceFactory::~CPieceFactory()
    {
        for (vector<CPiece *>::iterator it = m_vecPiece.begin(); it != m_vecPiece.end(); ++it)
        {
            if (*it != NULL)
            {
                delete *it;
                *it = NULL;
            }
        }
    }

    //////////////////////////////////////////////////////////////////////////
    void CChessboard::Draw(CPiece *piece)
    {
        if (WHITE == piece->GetColor())
        {
            cout<<"Draw a White"<<" at ("<<piece->GetPoint().x<<","<<piece->GetPoint().y<<")"<<endl;
        }
        else
        {
            cout<<"Draw a Black"<<" at ("<<piece->GetPoint().x<<","<<piece->GetPoint().y<<")"<<endl;
        }
        m_mapPieces.insert(pair<POINT, CPiece *>(piece->GetPoint(), piece));
    }

    void CChessboard::ShowAllPieces()
    {
        for (map<POINT, CPiece *>::iterator it = m_mapPieces.begin(); it != m_mapPieces.end(); ++it)
        {
            if (WHITE == it->second->GetColor())
            {
                cout<<"("<<it->first.x<<","<<it->first.y<<") has a White cheese."<<endl;
            }
            else
            {
                cout<<"("<<it->first.x<<","<<it->first.y<<") has a Black cheese."<<endl;
            }
        }
    }

    //////////////////////////////////////////////////////////////////////////
    void FlyweightPattern_Test()
    {
        CPieceFactory *pPieceFactory = new CPieceFactory();
        CChessboard *pCheseboard = new CChessboard();

        // The player1 get a white piece from the pieces bowl
        CPiece *pPiece = pPieceFactory->GetPiece(WHITE);
        pPiece->SetPoint(POINT(2, 3));
        pCheseboard->Draw(pPiece);

        // The player2 get a black piece from the pieces bowl
        pPiece = pPieceFactory->GetPiece(BLACK);
        pPiece->SetPoint(POINT(4, 5));
        pCheseboard->Draw(pPiece);

        // The player1 get a white piece from the pieces bowl
        pPiece = pPieceFactory->GetPiece(WHITE);
        pPiece->SetPoint(POINT(2, 4));
        pCheseboard->Draw(pPiece);

        // The player2 get a black piece from the pieces bowl
        pPiece = pPieceFactory->GetPiece(BLACK);
        pPiece->SetPoint(POINT(3, 5));
        pCheseboard->Draw(pPiece);

        /*......*/

        //Show all cheses
        cout<<"Show all cheses"<<endl;
        pCheseboard->ShowAllPieces();

        if (pCheseboard != NULL)
        {
            delete pCheseboard;
            pCheseboard = NULL;
        }
        if (pPieceFactory != NULL)
        {
            delete pPieceFactory;
            pPieceFactory = NULL;
        }
    }
}

客户端
#include "FlyweightPattern.h"


#include <iostream>
using namespace std;

using namespace FlyweightPattern;

void main()
{
    FlyweightPattern_Test();
}

运行结果
分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈(12):Flyweight 享元模式(结构型模式) (Level 300)

    享元模式是面向对象设计中的一种结构型模式,它的主要目的是通过共享大量相似对象来减少内存的使用,提高系统的性能。在C#编程语言中,我们可以利用享元模式来优化那些具有大量实例但大部分状态可以共享的对象。在这...

    设计模式之结构型模式

    在本文中,我们将深入探讨结构型设计模式,特别是桥接模式、适配器模式、装饰者模式和组合模式,以及它们在实际场景中的应用。 1. **桥接模式**: 桥接模式将抽象部分与实现部分分离,使得它们可以独立进行变化。...

    设计模式的享元模式的例子

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...

    设计模式之享元模式

    享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在处理大量对象时。在享元模式中,通过共享技术来有效支持大量细粒度的对象,从而减少内存消耗。《设计模式之禅》这本书是设计模式...

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...

    Java设计模式之结构型模式源码以及文档

    结构型模式可以分为七种:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。这些模式在不同的场景下有着各自的用途,它们可以帮助我们构建出灵活、可扩展的系统。 适配器模式允许两个不...

    享元模式代码示例

    享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低内存占用的目的。...在深入理解享元模式的基础上,结合具体的业务场景,我们可以灵活地运用这种模式来优化我们的代码。

    设计模式-享元模式(讲解及其实现代码)

    享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低系统内存占用、提高性能的目的。在软件工程中,当系统中存在大量相似或重复的对象时,享元模式尤为适用。 享元模式的核心是...

    享元模式代码+文档

    通过阅读代码,我们可以更深入地理解享元模式的运作机制。 总结来说,享元模式是一种有效的优化手段,特别是在处理大量相似对象时。通过理解和掌握享元模式,开发者可以更好地设计和优化系统,提高程序的运行效率。...

    设计模式之结构型模式uml类图EA文件.rar

    在给定的压缩包文件中,我们关注的是结构型设计模式,这些模式主要用于处理类和对象的组合与结构,以实现更灵活、可扩展的设计。下面我们将详细探讨其中涉及到的几个模式:桥接模式、适配器模式、装饰者模式和组合...

    [结构型模式] 装饰者模式的理解

    装饰者模式是设计模式中的一种结构型模式,它在不改变原有对象的基础上,动态地给对象添加新的行为或属性,以此来扩展对象的功能。这种模式遵循开闭原则,即对扩展开放,对修改关闭,是一种非常实用的设计策略。 ...

    享元模式,内含可运行代码和解释

    享元模式是一种经典的设计模式,属于结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在许多场景下,特别是计算机编程中,我们可能会遇到大量的相似对象,比如在图形...

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式)

    标题中的“C#面向对象设计模式纵横谈(9):Composite组合模式(结构型模式)”明确了文章的主题聚焦于C#语言环境下的设计模式探讨,具体到第9篇讨论的是“Composite组合模式”。这一模式属于结构型模式的一种,旨在解决...

    结构型模式部分知识

    在软件设计领域,结构型模式是面向对象设计中的一种重要思想,它主要关注如何组织类和对象,以形成更复杂的结构,同时保持代码的清晰性和可维护性。本资料是关于高等软件工程中的7大结构型模式的PPT总结,包含了大量...

Global site tag (gtag.js) - Google Analytics