享元模式的理解:

享元模式的定义:运用共享技术支持大量细粒度对象的复用;

Flyweight Pattern Definition:Use sharing to support large numbers of fine-grained efficiently.

享元模式关键词:大量、细粒度、复用、享元池、享元工厂;

  1. 当系统中存在大量的细粒度的相同或相似对象时,可以使用享元模式;
  2. 享元模式通过共享技术,实现相同或相似对象的重复利用;
  3. 享元的字面理解:享也就是分享共享的意思,元就是共享的元素、对象;
  4. Flyweight的字面理解:Flyweight本意是拳击运动的一个术语,就是蝇量级的意思,flyweight 蝇量级 112磅;
  5. 享元模式也叫轻量级模式,享元是对Flyweight的意译,直译的话应该叫蝇量级模式;
  6. 英文定义中采用Flyweight,是想表达对象的粒度,也就是fine-grained细粒度的意思;
  7. grain本意表示谷物,grained表示像谷物那种颗粒状态,即粒度,而fine-grained则表示细粒度,例如fine grained soil 细土、coarse grained soil粗粒土;
  8. 享元模式和Unity中的预制体作用类似,享元模式可以通过共享元素生成多个对象,Unity同样可以通过Prefabs生成成千上万的怪物;
  9. 还有诸如对象池、线程池,实际上也是享元模式的使用案例;

类图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的实现的更多相关文章

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

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

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

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

  3. 【GOF23设计模式】享元模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_享元模式.享元池.内部状态.外部状态.线程池.连接池 package com.test.flyweight; /** * ...

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

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

  5. Head First设计模式之享元模式(蝇量模式)

    一.定义 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...

  6. 【Unity3D与23种设计模式】享元模式(Flyweight)

    GoF中定义: "使用共享的方式,让一大群小规模对象能更有效地运行" 享元模式一般应用在游戏角色属性设置上 游戏策划需要通过"公式计算"或者"实际测试 ...

  7. Java进阶篇设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

  8. Java设计模式之七 ----- 享元模式和代理模式

    前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...

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

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

随机推荐

  1. CF1117G题解

    题意:区间建笛卡尔树,求每个节点的siz之和. 首先看到笛卡尔树,就应该想到,因为这是一个排列,可以找到通过左边和右边第一个比自己大的元素来"建立"笛卡尔树. 设 \(l(u)\) ...

  2. Ubuntu20安装nodejs和npm并切换阿里源

    参考 阿里巴巴开源镜像站 Ubuntu20安装npm并切换阿里源 安装直接在终端执行 sudo apt-get install nodejs npm没有安装上就执行 sudo apt-get inst ...

  3. 6月22日 Django中ORM的F查询和Q查询、事务、QuerySet方法大全

    一.F查询和Q查询 F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较.F() 的实 ...

  4. Docker安装与基本命令

    docker安装 Ubuntu 更新apt包索引 sudo apt-get update 更新apt包索引 sudo apt-get upgrade 安装docker sudo apt-get ins ...

  5. uoj310. 【UNR #2】黎明前的巧克力

    题目描述: uoj 题解: WTF. 看题解看了一个小时才看明白. 首先有状态$f[i][j]$表示前$i$个东西两人取,最后两人异或和为$j$的有多少方案. 转移为$f[i][j]=f[i-1][j ...

  6. 12.9 Override

    12.9 Override 静态方法 父类的引用可以指向子类静态方法(用static修饰的方法)的调用只和左边定义的数据类型有关,如: public class Person { public sta ...

  7. 一图学Python

    网上有这样一张图片,信息量很大,通常会被配上标题"一张图让你学会Python": 这张图流传甚广,但我没有找到明确的出处,图片上附带了 UliPad 的作者 Limodou 的信息 ...

  8. SpringAOP--动态数据源

    前言 通过注解和AOP,实现主从数据源的切换. 示例 首先项目布局: 1:实体类,与数据库表的映射 @Data @Builder public class UserBean { private Lon ...

  9. Java中会存在内存泄漏吗,请简单描述?

    为了搞清楚Java程序是否有内存泄露存在,我们首先了解一下什么是内存泄露:程序运行过程中会不断地分配内存空间:那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存.如果存在无用的内 ...

  10. 什么是Spring IOC 容器?

    Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期.