C#设计模式11——享元模式的写法
1. 什么是享元模式?
享元模式是一种结构型设计模式,目的是通过共享对象来尽量减少内存使用和对象数量。它通过将对象分为可共享的和不可共享的来实现这一目的。
2. 为什么要使用享元模式?
使用享元模式可以大大减少系统中对象的数量,从而减少了内存的使用。在对象数量较大,且需要相同状态的对象在内存中存在多个实例时,使用享元模式可以提高系统的性能和内存的使用效率。
3. 享元模式的核心思想是什么?
享元模式的核心思想是将对象分为内部状态和外部状态。内部状态是可以被共享的,而外部状态则需要在使用时进行传递。通过将内部状态共享,可以减少系统中相同状态对象的数量。
4. 什么是内部状态和外部状态?
内部状态是与对象的其余状态无关的状态,它可以被共享。外部状态则是与对象的其余状态有关的状态,需要在使用时单独传递。
5. 享元模式有哪些应用场景?
享元模式常用于大规模创建相同或相似对象的场景,例如线程池、缓存池以及字符串池等。此外,它还可以用于减少系统中相同状态对象的数量,提高系统性能和内存使用效率。
6. 享元模式的优点和缺点是什么?
享元模式的优点包括减少对象数量,提高系统性能和内存使用效率,同时降低代码复杂度。缺点则是由于需要将对象分为内部状态和外部状态,因此可能需要增加代码的复杂性。此外,由于共享对象可能被多个客户端同时使用,因此在开发过程中需要特别注意线程安全问题。
下面是一个简单的C#代码示例,演示了如何使用享元模式来创建和共享相同状态的对象:
using System.Collections.Generic;
// 定义享元对象接口
public interface IShape
{
void Draw();
}
// 实现具体的享元对象类
public class Circle : IShape
{
private string color;
public Circle(string color)
{
this.color = color;
}
public void Draw()
{
Console.WriteLine("Drawing a " + color + " circle.");
}
}
// 定义享元工厂类
public class ShapeFactory
{
private Dictionary<string, IShape> circleMap = new Dictionary<string, IShape>();
public IShape GetCircle(string color)
{
// 如果已经有相同颜色的圆形,直接返回
if (circleMap.ContainsKey(color))
{
return circleMap[color];
}
// 否则创建新的圆形并将其放入字典中
Circle circle = new Circle(color);
circleMap.Add(color, circle);
Console.WriteLine("Creating a " + color + " circle.");
return circle;
}
}
// 客户端代码
class Client
{
static void Main(string[] args)
{
ShapeFactory shapeFactory = new ShapeFactory();
// 获取红色圆形
IShape redCircle = shapeFactory.GetCircle("Red");
redCircle.Draw();
// 获取绿色圆形
IShape greenCircle = shapeFactory.GetCircle("Green");
greenCircle.Draw();
// 再次获取红色圆形
IShape redCircle2 = shapeFactory.GetCircle("Red");
redCircle2.Draw();
}
}
在这个示例中,我们创建了一个ShapeFactory类作为享元工厂,通过GetCircle方法可以获取具有相同颜色的圆形对象。如果之前已经有了相同颜色的圆形,那么就可以直接返回之前的对象,否则就创建新的圆形对象并将其加入到一个字典中进行共享。客户端代码则演示了如何使用这个工厂类来获取圆形对象,并绘制它们。
输出如下:
```
Creating a Red circle.
Drawing a Red circle.
Creating a Green circle.
Drawing a Green circle.
Drawing a Red circle.
```
这个示例中我们只创建了两个圆形对象:一个红色的和一个绿色的。当我们需要再次创建红色的圆形时,享元工厂检测到已经有一个红色的圆形对象,并直接返回之前的对象。这样就可以减少对象的创建数量,提高内存使用效率。
C#设计模式11——享元模式的写法的更多相关文章
- 设计模式-11享元模式(Flyweight Pattern)
1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...
- [设计模式] 11 享元模式 Flyweight
转 http://blog.csdn.net/wuzhekai1985/article/details/6670298 问题 在面向对象系统的设计何实现中,创建对象是最为常见的操作.这里面就有一个问题 ...
- python设计模式之享元模式
python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- C#设计模式学习笔记:(11)享元模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7792973.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第六个模式--享 ...
- 11.java设计模式之享元模式
基本需求: 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同 每个客户要求发布的方式不一样,A要求以新闻的方式发布,B要求以博客的方 ...
- 设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 11.享元模式(Flyweight Pattern)
面向对象的代价 面向对象很好地解决了系统抽象性的问题,同时在大多数情况下,也不会损及系统的性能.但是,在某些特殊的应用中下,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销.比如: ...
- 【设计模式】享元模式(Flyweight)
摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1 ...
- 【php设计模式】享元模式
享元模式其实就是共享独享模式,减少重复实例化对象的操作,从而将实例化对象造成的内存开销降到最低. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 ...
随机推荐
- Kernel Memory 入门系列: Embedding 简介
Kernel Memory 入门系列: Embedding 简介 在 RAG模式 其实留了一个问题. 我们对于的用户问题的理解和文档的检索并没有提供合适的方法. 当然我们可以通过相对比较传统的方法. ...
- 如何对U盘的使用权限进行管控
对U盘的使用权限进行管控是保护企业信息安全的一项重要措施.以下是一些常见的方法,可帮助您有效管理和控制U盘的使用权限: 禁用U盘端口: 在公司计算机上禁用或限制USB端口的使用,特别是那些不需要使用U ...
- MinIO客户端之tree
MinIO提供了一个命令行程序mc用于协助用户完成日常的维护.管理类工作. 官方资料 mc tree 使用树的形式,输出桶内的目录和文件. ./mc tree --files local1/bkt1 ...
- TypeScript核心基础
前言 为了方便我们直接使用脚手架让他帮我们直接编译就完事了 创建一个 Vue 应用 前提条件 熟悉命令行 已安装 16.0 或更高版本的 Node.js npm init vue@latest 这一指 ...
- Navicat Premium多用户破解方法 12以上版本
https://www.cnblogs.com/cgqplus/p/15267306.html 本文不提供注册机或者破解工具,本论坛多的是,搜索一下就好了. 本方法适用于多用户环境下使用,比如在服务器 ...
- 关于腾讯地图geolocation.getLocation 经常定位失败,定位时间过长的解决方法
今天遇到个项目,腾讯地图定位出现问题,导致地图无法呈现出最近的目标 这是正常的效果,之前一直出现贵州等地点的信息,查看控制台的网络后,发现腾讯的定位失败,要么就是定位时间过长,要20S左右,但是换ED ...
- 网站优化之favicon.ico
本文于2015年底完成,发布在个人博客网站上. 考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来. 背景 某一天在办公室分析产品首页加载速度时,无意中从Chrome浏览器的 ...
- IPv6通过公网共享文件(Windows)
前言 之前讲了如何使用IPv6进行内网穿透,这种方案实现的穿透是免费且不限速的.那么实现穿透后,我们就可以将原本Windows自带的共享功能的范围从局域网扩大到整个公网,从而实现随时随地都能访问到共享 ...
- antd5中文设定
antd5中文设定 import zhCN from "antd/lib/locale/zh_CN" <ConfigProvider locale={zhCN} theme= ...
- GaussDB(for Redis)双活容灾支持4大应用场景,为业务安全保驾护航
摘要:GaussDB(for Redis)的双活解决方案,支持同域主备.同域双主.异地主备.异地双主四大应用场景,提供了安全可靠的容灾能力. 一场火灾引发的思考 2021年3月10日,欧洲某云服务提供 ...