设计模式之:享元模式FlyweightPattern的实现
享元模式的理解:
享元模式的定义:运用共享技术支持大量细粒度对象的复用;
Flyweight Pattern Definition:Use sharing to support large numbers of fine-grained efficiently.
享元模式关键词:大量、细粒度、复用、享元池、享元工厂;
- 当系统中存在大量的细粒度的相同或相似对象时,可以使用享元模式;
- 享元模式通过共享技术,实现相同或相似对象的重复利用;
- 享元的字面理解:享也就是分享共享的意思,元就是共享的元素、对象;
- Flyweight的字面理解:Flyweight本意是拳击运动的一个术语,就是蝇量级的意思,flyweight 蝇量级 112磅;
- 享元模式也叫轻量级模式,享元是对Flyweight的意译,直译的话应该叫蝇量级模式;
- 英文定义中采用Flyweight,是想表达对象的粒度,也就是fine-grained细粒度的意思;
- grain本意表示谷物,grained表示像谷物那种颗粒状态,即粒度,而fine-grained则表示细粒度,例如fine grained soil 细土、coarse grained soil粗粒土;
- 享元模式和Unity中的预制体作用类似,享元模式可以通过共享元素生成多个对象,Unity同样可以通过Prefabs生成成千上万的怪物;
- 还有诸如对象池、线程池,实际上也是享元模式的使用案例;
类图with StarUML

棋子抽象类和2个实现类
internal abstract class Chessman
{
public abstract string GetColor();
public void Display() { Console.WriteLine($"棋子颜色{this.GetColor()}"); }
}
internal class BlackChessman : Chessman
{
public override string GetColor() { return "黑色"; }
}
internal class WhiteChessman : Chessman
{
public override string GetColor() { return "白色"; }
}
享元工厂类
internal class ChessmanFactory
{
//饿汉式单例模式
private static ChessmanFactory instance = new ChessmanFactory();
//该字典相当于享元池(对象池)Flyweight Pool
private Dictionary<string, Chessman> dictionary;
//构造注入依赖项Chessman/BlackChessman/WhiteChessman
private ChessmanFactory()
{
dictionary = new Dictionary<string, Chessman>();
Chessman black = new BlackChessman();
Chessman white = new WhiteChessman();
dictionary.Add("b", black);
dictionary.Add("w", white);
}
//返回唯一实例
public static ChessmanFactory GetInstance() { return instance; }
//根据键是b还是w,返回字典中的对应棋子
public Chessman GetChessman(string color) { return dictionary[color]; }
}
客户端
internal class Program
{
static void Main(string[] args)
{
Chessman black1, black2, white1, white2;
ChessmanFactory factory = ChessmanFactory.GetInstance();
//生成两颗黑子,并比较
black1 = factory.GetChessman("b");
black2 = factory.GetChessman("b");
Console.WriteLine($"两颗黑子是否相同?{black1 == black2}");
//生成两颗白字,并比较
white1 = factory.GetChessman("w");
white2 = factory.GetChessman("w");
Console.WriteLine($"两颗白子是否相同?{black1 == black2}");
//显示棋子
black1.Display();
black2.Display();
white1.Display();
white2.Display();
Console.Read();
}
}
运行结果

设计模式之:享元模式FlyweightPattern的实现的更多相关文章
- 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern)
原文:乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 享元模式(Flyweight Pattern) 作者:weba ...
- python设计模式之享元模式
python设计模式之享元模式 由于对象创建的开销,面向对象的系统可能会面临性能问题.性能问题通常在资源受限的嵌入式系统中出现,比如智能手机和平板电脑.大型复杂系统中也可能会出现同样的问题,因为要在其 ...
- 【GOF23设计模式】享元模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...
- 设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- Head First设计模式之享元模式(蝇量模式)
一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...
- 【Unity3D与23种设计模式】享元模式(Flyweight)
GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...
- Java进阶篇设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- Java设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- 【设计模式】享元模式(Flyweight)
摘要: 1.本文将详细介绍享元模式的原理和实际代码中特别是Android系统代码中的应用. 纲要: 1. 引入享元模式 2. 享元模式的概念及优缺点介绍 3. 享元模式在Android源码中的应用 1 ...
随机推荐
- CF1117G题解
题意:区间建笛卡尔树,求每个节点的siz之和. 首先看到笛卡尔树,就应该想到,因为这是一个排列,可以找到通过左边和右边第一个比自己大的元素来"建立"笛卡尔树. 设 \(l(u)\) ...
- Ubuntu20安装nodejs和npm并切换阿里源
参考 阿里巴巴开源镜像站 Ubuntu20安装npm并切换阿里源 安装直接在终端执行 sudo apt-get install nodejs npm没有安装上就执行 sudo apt-get inst ...
- 6月22日 Django中ORM的F查询和Q查询、事务、QuerySet方法大全
一.F查询和Q查询 F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较.F() 的实 ...
- Docker安装与基本命令
docker安装 Ubuntu 更新apt包索引 sudo apt-get update 更新apt包索引 sudo apt-get upgrade 安装docker sudo apt-get ins ...
- uoj310. 【UNR #2】黎明前的巧克力
题目描述: uoj 题解: WTF. 看题解看了一个小时才看明白. 首先有状态$f[i][j]$表示前$i$个东西两人取,最后两人异或和为$j$的有多少方案. 转移为$f[i][j]=f[i-1][j ...
- 12.9 Override
12.9 Override 静态方法 父类的引用可以指向子类静态方法(用static修饰的方法)的调用只和左边定义的数据类型有关,如: public class Person { public sta ...
- 一图学Python
网上有这样一张图片,信息量很大,通常会被配上标题"一张图让你学会Python": 这张图流传甚广,但我没有找到明确的出处,图片上附带了 UliPad 的作者 Limodou 的信息 ...
- SpringAOP--动态数据源
前言 通过注解和AOP,实现主从数据源的切换. 示例 首先项目布局: 1:实体类,与数据库表的映射 @Data @Builder public class UserBean { private Lon ...
- Java中会存在内存泄漏吗,请简单描述?
为了搞清楚Java程序是否有内存泄露存在,我们首先了解一下什么是内存泄露:程序运行过程中会不断地分配内存空间:那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存.如果存在无用的内 ...
- 什么是Spring IOC 容器?
Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期.