- 浏览: 369869 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (335)
- C++ (190)
- 设计模式 (43)
- 数据库技术 (5)
- 网络编程 (11)
- 自动化测试 (6)
- Linux (13)
- OpenSSL (10)
- MS Crypt API (5)
- SCM (2)
- English (4)
- Android (10)
- EMV规范 (1)
- Saturn Platform (0)
- C (10)
- SQL (2)
- ASP.NET (3)
- 英语口语学习 (3)
- 调试工具 (21)
- 编译技术 (5)
- UML (1)
- 项目管理 (5)
- 敏捷开发 (2)
- Http Server (6)
- 代码审查、代码分析 (5)
- 面试基础 (10)
- 重点知识 (16)
- STL (6)
- Efficient C++资料 (8)
- 数据结构和算法 (7)
- 读书笔记 (0)
- 开源项目 (4)
- 多线程 (2)
- Console App (6)
- 个人开源项目 (4)
- IBM DevelopWorks (4)
- Java (16)
- 内存泄漏相关调试和检测 (13)
- 软件测试相关技术 (2)
- C# (11)
- Apple Related (1)
- 软件测试和管理 (2)
- EMV (1)
- Python (1)
- Node.js (6)
- JavaScript (5)
- VUE (1)
- Frontend (1)
- Backend (4)
- RESTful API (3)
- Firebase (3)
最新评论
-
u013189503:
来个密码吧
[C++][Logging] 项目中写日志模块的实现 -
wyf_vc:
来个密码啊!!
[C++][Logging] 项目中写日志模块的实现
头文件
//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(); }
运行结果
- FlyweightPattern.zip (1.7 KB)
- 下载次数: 0
- Diagram.zip (558 KB)
- 下载次数: 0
- Diagram-raw.zip (216.7 KB)
- 下载次数: 0
发表评论
-
FreeRTOS
2022-03-05 16:31 248Ref https://blog.csdn.net/weix ... -
串口通讯相关
2018-11-02 13:44 411https://bbs.csdn.net/wap/topics ... -
[转]C++验证IP是否可以PING通
2018-10-30 17:54 1325https://www.cnblogs.com/guoyz13 ... -
C++/MFC 換皮膚
2018-10-20 11:05 477https://blog.csdn.net/u01123991 ... -
WinCE 截屏 - C++ 代碼
2018-08-31 09:45 574// this function create a bmp ... -
Android NDK搭建環境
2017-11-27 13:25 580https://www.cnblogs.com/ut2016- ... -
8583协议相关
2017-10-17 13:38 5738583相关资料,整理中... -
Java高级应用之JNI
2017-06-19 09:00 600参考link http://www.cnblogs.com/l ... -
C++实现ping功能
2017-04-18 11:21 2155基础知识 ping的过程是向目的IP发送一个type=8的I ... -
OpenSSL 编译环境搭建
2017-03-27 15:01 9061 安裝VS2008到 c:\Program Files (x ... -
最优非对称加密填充(OAEP)
2017-03-25 14:53 1582OpenSSL命令---rsautl http://blog. ... -
[Platform Builder] 设置SVM OS build Env
2016-11-10 11:39 01 copy one OSDesign Project to ... -
[Windows] System Error Codes(GetLastError )0-----5999
2016-10-26 13:28 1881ERROR_SUCCESS 0 (0x0) T ... -
开源Windows驱动程序框架
2016-09-17 21:35 871转自 http://code.csdn.net/news/28 ... -
c/c++代码中执行cmd命令
2016-09-14 14:50 1908转自 http://blog.csdn.net/slixinx ... -
C#使用C++标准DLL实例(包含callback)
2016-09-11 19:44 1086C++编写标准Win32DLL如下 头文件 /***** ... -
C#调用C++的DLL搜集整理的所有数据类型转换方式
2016-09-09 16:07 969转自 http://www.cnblogs.com/zeroo ... -
WinCE CPU使用率计算 测试工具
2016-09-08 16:14 991转自 http://blog.csdn.net/jan ... -
switch在C++与C#中的一些差异
2016-09-08 15:19 810参考链接 http://blog.csdn.net/weiwe ... -
C++ 鼠标模拟程序
2016-09-04 12:09 1612转自 http://blog.csdn.net/weixinh ...
相关推荐
享元模式是面向对象设计中的一种结构型模式,它的主要目的是通过共享大量相似对象来减少内存的使用,提高系统的性能。在C#编程语言中,我们可以利用享元模式来优化那些具有大量实例但大部分状态可以共享的对象。在这...
在本文中,我们将深入探讨结构型设计模式,特别是桥接模式、适配器模式、装饰者模式和组合模式,以及它们在实际场景中的应用。 1. **桥接模式**: 桥接模式将抽象部分与实现部分分离,使得它们可以独立进行变化。...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是通过共享大量细粒度对象来减少内存的使用,提高系统性能。在许多场景下,尤其是处理大量相似对象时,享元模式能显著减少内存开销。这个压缩包文件...
享元模式是软件设计模式中的一种结构型模式,它的主要目的是为了提高性能,尤其是在处理大量对象时。在享元模式中,通过共享技术来有效支持大量细粒度的对象,从而减少内存消耗。《设计模式之禅》这本书是设计模式...
设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...
结构型模式可以分为七种:适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。这些模式在不同的场景下有着各自的用途,它们可以帮助我们构建出灵活、可扩展的系统。 适配器模式允许两个不...
享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低内存占用的目的。...在深入理解享元模式的基础上,结合具体的业务场景,我们可以灵活地运用这种模式来优化我们的代码。
享元模式是一种结构型设计模式,它通过共享已有对象来减少内存中对象的数量,从而达到降低系统内存占用、提高性能的目的。在软件工程中,当系统中存在大量相似或重复的对象时,享元模式尤为适用。 享元模式的核心是...
通过阅读代码,我们可以更深入地理解享元模式的运作机制。 总结来说,享元模式是一种有效的优化手段,特别是在处理大量相似对象时。通过理解和掌握享元模式,开发者可以更好地设计和优化系统,提高程序的运行效率。...
在给定的压缩包文件中,我们关注的是结构型设计模式,这些模式主要用于处理类和对象的组合与结构,以实现更灵活、可扩展的设计。下面我们将详细探讨其中涉及到的几个模式:桥接模式、适配器模式、装饰者模式和组合...
装饰者模式是设计模式中的一种结构型模式,它在不改变原有对象的基础上,动态地给对象添加新的行为或属性,以此来扩展对象的功能。这种模式遵循开闭原则,即对扩展开放,对修改关闭,是一种非常实用的设计策略。 ...
享元模式是一种经典的设计模式,属于结构型模式,它的核心思想是通过共享已经存在的对象来减少内存中的对象数量,从而提高系统性能。在许多场景下,特别是计算机编程中,我们可能会遇到大量的相似对象,比如在图形...
标题中的“C#面向对象设计模式纵横谈(9):Composite组合模式(结构型模式)”明确了文章的主题聚焦于C#语言环境下的设计模式探讨,具体到第9篇讨论的是“Composite组合模式”。这一模式属于结构型模式的一种,旨在解决...
在软件设计领域,结构型模式是面向对象设计中的一种重要思想,它主要关注如何组织类和对象,以形成更复杂的结构,同时保持代码的清晰性和可维护性。本资料是关于高等软件工程中的7大结构型模式的PPT总结,包含了大量...