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——享元模式的写法的更多相关文章

  1. 设计模式-11享元模式(Flyweight Pattern)

    1.模式动机 在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈. 享元模式就是把相同或相似对象的公共部分提取出 ...

  2. [设计模式] 11 享元模式 Flyweight

    转 http://blog.csdn.net/wuzhekai1985/article/details/6670298 问题 在面向对象系统的设计何实现中,创建对象是最为常见的操作.这里面就有一个问题 ...

  3. python设计模式之享元模式

    python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...

  4. 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)

    原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...

  5. C#设计模式学习笔记:(11)享元模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7792973.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第六个模式--享 ...

  6. 11.java设计模式之享元模式

    基本需求: 小型的外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同 每个客户要求发布的方式不一样,A要求以新闻的方式发布,B要求以博客的方 ...

  7. 设计模式之享元模式(Flyweight)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 11.享元模式(Flyweight Pattern)

    面向对象的代价    面向对象很好地解决了系统抽象性的问题,同时在大多数情况下,也不会损及系统的性能.但是,在某些特殊的应用中下,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销.比如: ...

  9. 【设计模式】享元模式(Flyweight)

    摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1 ...

  10. 【php设计模式】享元模式

    享元模式其实就是共享独享模式,减少重复实例化对象的操作,从而将实例化对象造成的内存开销降到最低. 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象.我们将通过创建 5 个对象来画出 ...

随机推荐

  1. 通过 VS Code 优雅地编辑 Pod 内的代码(非 NodePort)

    目录 1. 概述 2. NodePort 方式 3. Ingress 方式 4. 救命稻草 5. 其他 1. 概述 今天聊点啥呢,话说,你有没有想过怎样用 VS Code 连上 K8s 集群内的某个 ...

  2. Hive SQL之表与建表

    数据类型:  建表 create database itheima; --1.创建一张表 -- 表名 --字段 名称 类型 顺序 --字段之间的分隔符 create table itheima.t_a ...

  3. 34. 干货系列从零用Rust编写负载均衡及代理,异步测试在Rust中的实现

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  4. 深入 K8s 网络原理(一)- Flannel VXLAN 模式分析

    目录 1. 概述 2. TL;DR 3. Pod 间通信问题的由来 4. 测试环境准备 5. 从 veth 设备聊起 6. 网桥 cni0 6.1 在 Pod 内看网卡信息 6.2 在 host 上看 ...

  5. 浅谈JSP中forward和redirect

    redirect 重定向,完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接 forward 转向,浏览器中不会显示后面的网址;如果你需要在下一个页面中能从中获取新的信息的话,你可以Reques ...

  6. 【C#】【命名空间(namespace)】.NET6.0后支持的顶级语句使用问题

    创建C#项目且使用.Net6.0以上的版本时,默认code会使用顶级语句形式: 1.略去static void Main(String[ ] args)主方法入口: 2.隐式使用(即隐藏且根据代码所需 ...

  7. Python趣味入门12:初遇类与实例

    小牛叔用轻松有趣的故事,带你进入Python的编程世界. 1.类 一提到类大神们就经常说封装.说白了,封装即把围绕同一个对象相同的代码.数据整合在一起.比如在某段游戏代码中(比如熊猫厨房),有一个&q ...

  8. Redis 分片集群

    1.Redis分片集群 1.1.搭建分片集群 主从和哨兵可以解决高可用.高并发读的问题.但是依然有两个问题没有解决: 海量数据存储问题 高并发写的问题 使用分片集群可以解决上述问题,如图: 分片集群特 ...

  9. linux文件和文件夹的筛选、查找及用户和组管理命令

    1.列出当前系统上所有已经登陆的用户的用户名, 注意:同一个用户登录多次,则只显示一次即可. 查看系统用户的命令为: (1)getent passwd 查看系统上的所有用户信息 (2)w 查看登录用户 ...

  10. LeetCode 947. 移除最多的同行或同列石头 并查集

    传送门 思路 干货太干就不太好理解了,以下会有点话痨( ̄▽ ̄)" 首先题目给了一个二维stones数组,存储每个石子的坐标,因为在同行或者同列的石子最终可以被取到只剩下一个,那么我们将同行同 ...