單例模式 和 策略模式



單例模式(Singleton Pattern):確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,
這個類稱爲單例類,它提供全局訪問的方法。單例模式是一種對象創建型模式。


單例模式有三個要點:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。

====================================================================================================================

class CSingleton
{
private:
    CSingleton()   //構造函數是私有的
    {
    }
    static CSingleton *m_pInstance;
public:
    static CSingleton * GetInstance()
    {
        if(m_pInstance == NULL)  //判斷是否第一次調用
            m_pInstance = new CSingleton();
        return m_pInstance;
    }
};
===================================================================================================================

我們知道,程序在結束的時候,系統會自動析構所有的全局變量。事實上,系統也會析構所有的類的靜態成員變量,
就像這些靜態成員也是全局變量一樣。利用這個特徵,我們可以在單例類中定義一個這樣的靜態成員變量,
而它的唯一工作就是在析構函數中刪除單例類的實例。如下面的代碼中的CGarbo類(Garbo意爲垃圾工人):

class CSingleton
{
private:
    CSingleton()
    {
    }
    static CSingleton *m_pInstance;
    class CGarbo   //它的唯一工作就是在析構函數中刪除CSingleton的實例
    {
    public:
        ~CGarbo()
        {
            if(CSingleton::m_pInstance)
                delete CSingleton::m_pInstance;
        }
    };
    static CGarbo Garbo;  //定義一個靜態成員變量,程序結束時,系統會自動調用它的析構函數
public:
    static CSingleton * GetInstance()
    {
        if(m_pInstance == NULL)  //判斷是否第一次調用
            m_pInstance = new CSingleton();
        return m_pInstance;
    }
};
================================================================================================================================

1.主要優點

        單例模式的主要優點如下:

        (1) 單例模式提供了對唯一實例的受控訪問。因爲單例類封裝了它的唯一實例,所以它可以嚴格控制客戶怎樣以及何時訪問它。

        (2) 由於在系統內存中只存在一個對象,因此可以節約系統資源,對於一些需要頻繁創建和銷燬的對象單例模式無疑可以提高系統的性能。




2.主要缺點

        單例模式的主要缺點如下:

        (1) 由於單例模式中沒有抽象層,因此單例類的擴展有很大的困難。

        (2) 單例類的職責過重,在一定程度上違背了“單一職責原則”。因爲單例類既充當了工廠角色,提供了工廠方法,同時又充當了產品角色,包含一些業務方法,將產品的創建和產品的本身的功能融合到一起


===================================================================================================================
C++設計模式——策略模式

 在策略模式中,我們可以定義一些獨立的類來封裝不同的算法,每一個類封裝一種具體的算法,在這裏,
 每一個封裝算法的類我們都可以稱之爲一種策略(Strategy),爲了保證這些策略在使用時具有一致性,
 一般會提供一個抽象的策略類來做規則的定義,而每種算法則對應於一個具體策略類。

 策略模式(Strategy Pattern):定義一系列算法類,將每一個算法封裝起來,並讓它們可以相互替換,
 策略模式讓算法獨立於使用它的客戶而變化,也稱爲政策模式(Policy)。策略模式是一種對象行爲型模式。

  Context(環境類):環境類是使用算法的角色,在環境類中維持一個對抽象策略類的引用實例
  Strategy(抽象策略類):它爲所支持的算法聲明瞭抽象方法,是所有策略類的父類,
  ConcreteStrategy(具體策略類):它實現了在抽象策略類中聲明的算法,

  ===================================================================================================================
  2.1 抽象策略和具體策略

    可以設計一個抽象武器類,具體武器如斧頭、手槍、AK47繼承於抽象武器類。

    武器類的實現代碼如下:
    #ifndef _WEAPON_H_
#define _WEAPON_H_
#include <iostream>
#include <string>
using namespace std;

//抽象武器類(抽象策略)
class Weapon
{
public:
    //虛方法,使用武器打鬥
    virtual void Fight(string Player) = 0;
};


//手槍(具體策略)
class Gun : public Weapon
{
public:
    void Fight(string Player, int nKillAbility)
    {
        cout << "遊戲玩家:" << Player << "   戰鬥力:8級" << endl;
    }
};


//Ak47衝鋒槍(具體策略)
class Ak47 : public Weapon
{
public:
    void Fight(string Player)
    {
        cout << "遊戲玩家:" << Player << "   戰鬥力:10級" <<  endl;
    }
};


//斧頭(具體策略)
class Axe : public Weapon
{
public:
    void Fight(string Player)
    {
        cout << "遊戲玩家:" << Player << "   戰鬥力:6級" <<  endl;
    }
};


#endif
===================================================================================================================
2.2 環境類(遊戲玩家)

    現在需要設計一個遊戲玩家類,也就是環境類,遊戲玩家來使用具體的某種武器。遊戲玩家實現代碼如下:


#ifndef _PLAYER_H_
#define _PLAYER_H_
#include <iostream>
#include <string>
#include "Weapon.h"

using namespace std;

//遊戲玩家(環境類)
class Player 
{
private:
    //玩家名稱
    string m_strPlayer;

    //玩家使用的武器
    Weapon * m_pWeapon;
public:
    //設置玩家名稱
    void SetPlayer(string strPlayer)
    {
        m_strPlayer = strPlayer;
    }

    //設置玩家使用的武器
    void SetWeapon(Weapon * pWeapon)
    {
        m_pWeapon = pWeapon;
    }

    //玩家使用武器打鬥
    void Fight()
    {
        m_pWeapon->Fight(m_strPlayer);
    }
};

#endif
===================================================================================================================
2.3 測試2.2 環境類(遊戲玩家)

    現在需要設計一個遊戲玩家類,也就是環境類,遊戲玩家來使用具體的某種武器。遊戲玩家實現代碼如下:


#ifndef _PLAYER_H_
#define _PLAYER_H_
#include <iostream>
#include <string>
#include "Weapon.h"

using namespace std;

//遊戲玩家(環境類)
class Player 
{
private:
    //玩家名稱
    string m_strPlayer;

    //玩家使用的武器
    Weapon * m_pWeapon;
public:
    //設置玩家名稱
    void SetPlayer(string strPlayer)
    {
        m_strPlayer = strPlayer;
    }

    //設置玩家使用的武器
    void SetWeapon(Weapon * pWeapon)
    {
        m_pWeapon = pWeapon;
    }

    //玩家使用武器打鬥
    void Fight()
    {
        m_pWeapon->Fight(m_strPlayer);
    }
};

#endif
===================================================================================================================
2.3 測試
遊戲玩家Player維持一個武器類對象的引用。當玩家需要使用某種武器的時候,只需要把武器通過SetWeapon設置給玩家,
玩家就可以通過使用這種武器進行打鬥操作,實際上調用的仍是武器類的打鬥方法。測試代碼實現如下:

#include <iostream>
#include "Player.h"
#include "Weapon.h"

using namespace std;

int main()
{
    //創建Ak47武器對象
    Weapon * pAk47 = new Ak47();

    //創建玩家對象
    Player * pPlayer = new Player();
    pPlayer->SetPlayer("挑戰者");
    pPlayer->SetWeapon(pAk47);

    //打鬥
    pPlayer->Fight();

        //銷燬操作
    delete pPlayer;
    pPlayer = NULL;

    delete pAk47;
    pAk47 = NULL;

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章