天天看点

设计模式--结构型模式--享元模式

#include "stdafx.h"

#include <stdio.h>

#include <stdlib.h>

#include <string>

#include <iostream>

using namespace std;

//Structural Patterns--Flyweight

//结构型模式--享元模式

//Flyweight(抽象享元类):通常是一个抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),同时也可以通过这些方法来设置外部数据(外部状态)。

//ConcreteFlyweight(具体享元类):实现了抽象享元类,其实例称为享元对象;在具体享元类中为内部状态提供了存储空间。通常可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。

//UnsharedConcreteFlyweight(非共享具体享元类):并不是所有抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类,当需要一个非共享具体享元类的对象时可以直接通过实例化创建。

//FlyweightFactory(享元工厂类):用于创建并管理享元对象,它针对抽象享元类编程,将各种类型的具体享元对象存储在一个享元池中,享元池一般设计为一个存储“键值对”的集合(也可以是其他类型的集合),

//    可以结合工厂模式进行设计;当用户请求一个具体享元对象时,享元工厂提供一个存储在享元池中已创建的实例或者创建一个新的实例(如果不存在的话),返回新创建的实例并将其存储在享元池中。

enum MoneyCategory    //类别,内在标识,做为标识码

{

    Coin,

    bankNote

};

enum FaceValue    //面值,外部标识,需要存储的对象

{

    ValueOne = 1,

    ValueTwo

};

class Money    //Flyweight(抽象享元类)

{

public:

    Money(MoneyCategory cate):m_cate(cate){}

    virtual ~Money(){cout << "~Money()" << endl;}

    virtual void save() = 0;

private:

    MoneyCategory m_cate;

};

class MoneyCoin : public Money    //ConcreteFlyweight(具体享元类)

{

public:

    MoneyCoin(MoneyCategory cate):Money(cate){}

    ~MoneyCoin(){cout<<"~MoneyCoin()"<<endl;}

    void save(){cout << "save coin." << endl;}

};

class MoneyNote : public Money    //ConcreteFlyweight(具体享元类)

{

public:

    MoneyNote(MoneyCategory cate):Money(cate){}

    ~MoneyNote(){cout << "~MoneyNote()" << endl;}

    void save(){cout << "save note." << endl;}

};

class bank    //FlyweightFactory(享元工厂类)

{

public:

    bank():m_coin(NULL),m_note(NULL){}

    ~bank()

    {

        if(m_coin != NULL){delete m_coin ; m_coin = NULL;}

        if(m_note != NULL){delete m_note ; m_note = NULL;}

    }

    void saveMoney(MoneyCategory cate , FaceValue value)

    {

        switch(cate)

        {

        case Coin:

            if(m_coin == NULL){m_coin = new MoneyCoin(cate);}

            m_coin->save();

            m_vector.push_back(value);

            break;

        case bankNote:

            if(m_note == NULL){m_note = new MoneyNote(cate);}

            m_note->save();

            m_vector.push_back(value);

            break;

        default:

            break;

        }

    }

    int sumSave()

    {

        int count = 0;

        for(auto iter = m_vector.begin(); iter != m_vector.end() ; iter++)

        {

            count += *iter;

        }

        return count;

    }

private:

    std::vector<FaceValue> m_vector;

    Money *m_coin;

    Money *m_note;

};

//-------------------------------------------

//测试

void dpFlyweihtTestMain()

{

    bank bn;

    bn.saveMoney(Coin , ValueOne);

    bn.saveMoney(Coin , ValueTwo);

    bn.saveMoney(bankNote , ValueOne);

    bn.saveMoney(bankNote , ValueTwo);

    cout << bn.sumSave() << endl;

    return;

}

继续阅读