程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 大話設計模式C++實現-享元模式

大話設計模式C++實現-享元模式

編輯:C++入門知識

大話設計模式C++實現-享元模式


一、UML圖

\

二、概念

享元模式(Flyweight):運用共享技術有效地支持大量細粒度的對象。

flyweight的意思:輕量級。

 

三、說明

 

角色:

(1)Flyweight類:它是所有具體享元類的超類或接口,通過這個接口,Flyweight可以接受並作用於外部狀態。

(2)ConcreteFlyweight類:繼承Flyweight超類或實現Flyweight接口,並為內部狀態增加存儲空間。

(3)UnsharedConcreteFlyweight:是指那些不需要共享的Flyweight子類。因為Flyweight接口共享成為可能,但是它並不強制共享。

(4)FlyweightFactory:是一個享元工廠,用來創建並管理Flyweight對象。它主要是用來確保合理地共享Flyweight,當用戶請求一個Flyweight時,FlyweightFactory對象提供一個已創建的實例或者創建一個(如果不存在的話)。

 

用享元模式的好處?

享元模式可以避免大量非常相似類的開銷。在程序設計中,有時需要生成大量細粒度的類實例來表示數據。如果能發現這些實例除了幾個參數外基本上都是相同的,有時就能夠大幅度的減少需要實例化的類的數量。如果能把那些參數移到類實例的外面,在方法調用時將它們傳遞進來,就可以通過共享大幅度地減少單個實例的數目。

也就是說,享元模式Flyweight執行時所需的狀態是有內部的也可能有外部的,內部狀態存儲於ConcreteFlyweight對象之中,而外部對象則應該考慮由客戶端對象存儲或計算,當調用Flyweight對象的操作時,將該狀態傳遞給它。

 

什麼時候用享元模式?

如果一個應用程序使用了大量的對象,而大量的這些對象造成了很大的存儲開銷時就應該考慮使用;還有就是對象的大多數狀態可以外部狀態,如果刪除對象的外部狀態,那麼可以用相對較少的共享對象取代很多組對象,此時可以考慮使用享元模式。

 

四、C++實現

(1)Flyweight.h

 

#ifndef FLYWEIGHT_H
#define FLYWEIGHT_H

#include 
#include 
#include

//用戶類
class User
{
private:
	std::string name;
public:
	User(std::string name)
	{
		this->name=name;
	}
	std::string GetName()
	{
		return this->name;
	}
};

//Flyweight類,此處為抽象網站類
class WebSite
{
public:
	virtual void Use(User user)=0;
};

//ConcreteFlyweight類,此處為具體網站類
class ConcreteWebSite:public WebSite
{
private:
	std::string name;
public:
	ConcreteWebSite(std::string name)
	{
		this->name=name;
	}
	void Use(User user)
	{
		std::cout<<"網站分類:"<


 

(2)Client.cpp

 

#include "Flyweight.h"
#include 
#include 

//Client,客戶端
void main()
{
	WebSiteFactory f;

	WebSite* fx=f.GetWebSiteCategory("產品展示");
	fx->Use(User("小菜"));

	WebSite* fy=f.GetWebSiteCategory("產品展示");
	fy->Use(User("大鳥"));

	WebSite* fz=f.GetWebSiteCategory("產品展示");
	fz->Use(User("嬌嬌"));www.Bkjia.com

	WebSite* fl=f.GetWebSiteCategory("博客");
	fl->Use(User("老頑童"));

	WebSite* fm=f.GetWebSiteCategory("博客");
	fm->Use(User("桃谷六仙"));

	WebSite* fn=f.GetWebSiteCategory("博客");
	fn->Use(User("南海鳄神"));

	std::cout<<"得到網站分類總數:"<

 

(3)運行截圖

\

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved