c++享元模式

2023-11-18

享元模式

1、享元模式简介

  享元模式在《设计模式:可复用面向对象软件的基础》一书中是这样说的:运用共享技术有效地支持大量细粒度的对象。本质就是对大量细粒度的对象进行共享,不是每个对象都要通过new的方式去创建,而是通过区分对象的内部状态和外部状态来实现共享。以此来达到减少系统的开销,提高程序性能的目的。

2、应用场景

  在某个类在系统中有大量的实例时,并且可根据这些实例的特征分离出内部状态可外部状态。

3、实例讲解

  以五子棋为例,常规情况如果每下一颗棋就去new一个对象的话。会造成大量重复的系统开销。影响系统性能,显然这种方式是不必要的。那么我们可以使用享元模式来解决此类问题。可以在棋子中抽象出内部状态可外部状态,棋子的属性无非是颜色和位置,颜色非黑即白我们可以作为内部状态,由棋子类的对象来维护,棋子的位置如果也为内部状态,且每颗棋子的位置都是不同的,那每颗棋子仍然是要通过new的方式来构建棋子对象。故棋子的位置要作为外部状态,不在棋子的内部进行维护,而是由上层调用棋子处维护。如此便区分了内部和外部状态,以下代码示例:

3.1、棋子类实现

//棋子颜色
enum PieceColor {BLACK, WHITE};
//棋子位置
struct PiecePos
{
	int x;
	int y;
	PiecePos(int a, int b): x(a), y(b) {}
};
//棋子定义
class Piece
{
protected:
	PieceColor m_color; //颜色
public:
	Piece(PieceColor color): m_color(color) {}
	~Piece() {}
	virtual void Draw() {}
};
class BlackPiece: public Piece
{
public:
	BlackPiece(PieceColor color): Piece(color) {}
	~BlackPiece() {}
	void Draw() { cout<<"绘制一颗黑棋\n"; }
};
class WhitePiece: public Piece
{
public:
	WhitePiece(PieceColor color): Piece(color) {}
	~WhitePiece() {}
	void Draw() { cout<<"绘制一颗白棋\n";}
};

3.2、棋盘类实现

class PieceBoard
{
private:
	vector<PiecePos> m_vecPos; //存放棋子的位置
	Piece *m_blackPiece;       //黑棋棋子 
	Piece *m_whitePiece;       //白棋棋子
	string m_blackName;
	string m_whiteName;
public:
	PieceBoard(string black, string white): m_blackName(black), m_whiteName(white)
	{
		m_blackPiece = NULL;
		m_whitePiece = NULL;
	}
	~PieceBoard() { delete m_blackPiece; delete m_whitePiece;}
	void SetPiece(PieceColor color, PiecePos pos)
	{
		if(color == BLACK)
		{
			if(m_blackPiece == NULL)  //只有一颗黑棋
				m_blackPiece = new BlackPiece(color);	
			cout<<m_blackName<<"在位置("<<pos.x<<','<<pos.y<<")";
			m_blackPiece->Draw();
		}
		else
		{
			if(m_whitePiece == NULL)
				m_whitePiece = new WhitePiece(color);
			cout<<m_whiteName<<"在位置("<<pos.x<<','<<pos.y<<")";
			m_whitePiece->Draw();
		}
		m_vecPos.push_back(pos);
	}
};

3.3、 客户端调用:

int main()
{
	PieceBoard pieceBoard("A","B");
	pieceBoard.SetPiece(BLACK, PiecePos(4, 4));
	pieceBoard.SetPiece(WHITE, PiecePos(4, 16));
	pieceBoard.SetPiece(BLACK, PiecePos(16, 4));
	pieceBoard.SetPiece(WHITE, PiecePos(16, 16));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++享元模式 的相关文章

随机推荐

  • Go 1.19.3 context原理简析

    Context context Context一般用作函数或方法的第一个参数 其作用为管控协程在用户侧 生命周期 它是线程安全的 在多个goroutine之间可以任意调用其方法 不需考虑锁的问题 原理简析 context的结构是一棵以Bac
  • scrapy mysql的同步插入与异步插入

    主要代码是在Pipeline中进行编写 上完整代码 同步插入代码 同步插入 class MysqlPipeline2 object 同步操作 def init self 建立连接 self conn pymysql connect loca
  • opencv实现答题卡识别

    识别答题卡 import cv2 import numpy as np def showImg img name img cv2 imshow img name img cv2 waitKey cv2 destroyAllWindows d
  • VMware下载与安装

    VMware的简介 VMWare虚拟机软件是一个 虚拟PC 软件 它使你可以在一台机器上同时运行二个或更多Windows DOS LINUX系统 与 多启动 系统相比 VMWare采用了完全不同的概念 多启动系统在一个时刻只能运行一个系统
  • 扩散模型大杀器 ControlNet 解析

    Controlnet的介绍 1 论文信息 标题 Adding Conditional Control to Text to Image Diffusion Models 作者 Lvmin Zhang Maneesh Agrawala 原文链
  • Object.entries()方法使用详解

    一 概述 对象的数据处理方法 我们熟知的有很多 比如Object keys Object values for in等 本文将其与其它常见使用方法进行对比 详细解析其特性 二 对比 for in Object entries 方法的优势 1
  • Python计算过去周末的方法

    在Python中 我们可以使用datetime模块来计算过去的周末数量 datetime模块提供了各种日期和时间相关的函数和类 使我们可以轻松地处理日期和时间 首先 我们需要导入datetime模块 import datetime 然后 我
  • Vue自定义指令 「干货」

    在 Vue 除了核心功能默认内置的指令 v model 和 v show Vue 也允许注册自定义指令 它的作用价值在于当开发人员在某些场景下需要对普通 DOM 元素进行操作 Vue 自定义指令有全局注册和局部注册两种方式 先来看看注册全局
  • springboot修改端口号的两种方式

    前言 springboot默认的端口号为8080 端口号的配置有两种方式 一种是在配置文件application properties中 另一种是在配置文件application yml中 1 第一种方式 修改配置文件application
  • 最短路径-Dijkstra算法与Floyd算法

    最短路径 Dijkstra算法与Floyd算法 原文 https www cnblogs com smile233 p 8303673 html 一 最短路径 在非网图中 最短路径是指两顶点之间经历的边数最少的路径 AE 1 ADE 2 A
  • 【ubuntu22.04 安装优麒麟wine封装版微信】

    选择该版本原因 目前使用体验来说优于deepin封装版 1 到优麒麟软件下载页面找到微信 wine 下载Wine环境包和 微信 wine 包 2 终端输入 sudo apt get install f y ukylin wine 70 6
  • linux 环境下 openssl 生成ecdsa公、私钥

    我的个人博客 逐步前行STEP 1 生成ecdsa私钥 openssl ecparam name prime256v1 genkey noout out prime256v1 key pem 2 从ecdsa私钥提取公钥 openssl p
  • windows下anaconda3安装MySQLdb

    本文转自Windows下python3 6 安装MySQLdb 首先需要下载windows版本的mysqlclient 原作者给出了其中一个版本的下载链接 下载之后 放到合适的文件目录中 然后打开anaconda自带的Anaconda Pr
  • java使用switch语句完成输入1~12之间的整数,显示该月份的英语单词及这个月属第几季度。

    1 程序代码如下 package java实训 import java util Scanner public class SJ4 public static void main String args Scanner input new
  • AI Cloud将百花齐放,青云科技已先走了一步

    三年前 国家超级计算济南中心 济南超算 悄悄干了一件大事 投资数十亿元致力于打造一个融HPC超算 传统云计算 以CPU为主 和智算 以GPU为主 为一体的多元算力中心 这就需要一个统一的并且可以对外开放的运维和运营平台 那时还在打磨阶段的青
  • python注释快捷键 引号注释快捷键 注释字体样式调整

    python注释快捷键分为两种 单行注释 单行注释快捷键是CTRL list red green blue yellow white black print list 0 print list 1 print list 2 list red
  • VS E2996 错误过多,导致IntelliSense引擎无法正常工作。其中一些错误可能在编辑器中不可见。代码没有提示

    一 错误的问题描述 二 这个问题导致的后果 后面程序中用到的很多都会显示找不到定义 三 说实话这个问题真的很坑 由于我更换了我程序的工作电脑 我在VS中属性管理器中重新配置了头文件和对应的库目录 但是这里我犯了一个小错误 就是我更换的时候
  • QT开发技巧之QTableWidget设置表头颜色字体

    1 默认的表头和内容背景字体一样不好区别 可以通过qss设置修改表头样式 2 修改后效果如下 qss代码 表格头背景色 QHeaderView section background rgb 128 255 255 font family 宋
  • vue引入阿里图标 Module parse failed: Unexpected character '�' (1:0)

    操作根据文章 https blog csdn net qq 32113629 article details 79740949 在自己跟着试了一下后报错 Module parse failed Unexpected character 1
  • c++享元模式

    享元模式 1 享元模式简介 享元模式在 设计模式 可复用面向对象软件的基础 一书中是这样说的 运用共享技术有效地支持大量细粒度的对象 本质就是对大量细粒度的对象进行共享 不是每个对象都要通过new的方式去创建 而是通过区分对象的内部状态和外