结构型模式 - 享元模式Flyweight
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。
更像是单例模式 + 简单工厂模式

享元模式的定义与特点
享元(Fiyweight)模式的定义:运用共享技术来有效的支持大量细粒度对象的复用。他通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量类似类的开销,从而提高资源的利用率。
享元模式的主要优点是
- 相同对象只要保存一份,这降低了系统中细粒度对象给内存到来的压力。
- 降低了内存消耗。
享元模式其主要缺点是
- 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
- 读取享元模式的外部状态会使得运行时间稍微变长。
享元模式的结构与实现
享元模式的定义提出两个要求,细粒度和共享对象。因为要求细粒度,所以不可避免地会是对象数量多且性质相近,此时我们就将这些对象的信息分为两个部分:内部状态和外部状态。
- 内部状态是指对象共享出来的信息,存储在享元信息内部,并且不会随环境的改变而改变;
- 外部状态指对象得以依赖的一个标记,随环境的改变而改变,不可共享。
1. 模式的结构
- 抽象享元角色(Flyweight):是所有的具体享元类的基类,为具体享元规范需要实现的公共接口,非享元的外部状态以参数的形式通过方法传入。
- 具体享元(Concrete Flyweight)角色:实现抽象享元角色中所规定的接口。
- 非享元(Unsharable Flyweight)角色:是不可以共享的外部状态,它以参数的形式注入具体享元的相关方法中。
- 享元工厂(Flyweight Factory)角色:负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象。
图 1 是享元模式的结构图,其中:
- UnsharedConcreteFlyweight 是非享元角色,里面包含了非共享的外部状态信息 info;
- Flyweight 是抽象享元角色,里面包含了享元方法 operation(UnsharedConcreteFlyweight state),非享元的外部状态以参数的形式通过该方法传入;
- ConcreteFlyweight 是具体享元角色,包含了关键字 key,它实现了抽象享元接口;
- FlyweightFactory 是享元工厂角色,它是关键字 key 来管理具体享元;
- 客户角色通过享元工厂获取具体享元,并访问具体享元的相关方法。
享元模式代码案例
using DesignPattern.FlyweightPattern;
using System;
namespace DesignPattern
{
internal class Program
{
static void Main(string[] args)
{
FlyweightHelper();
}
#region Pattern - Flyweight
static void FlyweightHelper()
{
LetterFlyWeight _letters = new LetterFlyWeight();
Console.WriteLine("当前打印: " + _letters.Print("A"));
Console.WriteLine("当前打印: " + _letters.Print("B"));
Console.WriteLine("当前打印: " + _letters.Print("C"));
Console.WriteLine("当前打印: " + _letters.Print("D"));
Console.WriteLine("当前打印: " + _letters.Print("E"));
Console.WriteLine("当前打印: " + _letters.Print("F"));
Console.WriteLine();
Console.WriteLine("---------" + _letters.Print("E") + _letters.Print("F") + _letters.Print("F") + _letters.Print("A") + _letters.Print("C") + _letters.Print("E"));
Console.ReadLine();
}
#endregion
}
}
//======================================================================================
namespace DesignPattern.FlyweightPattern
{
public abstract class Letter
{
public abstract string Print();
}
public class LetterA : Letter
{
public override string Print() { return "A"; }
}
public class LetterB : Letter
{
public override string Print() { return "B"; }
}
public class LetterC : Letter
{
public override string Print() { return "C"; }
}
public class LetterD : Letter
{
public override string Print() { return "D"; }
}
public class LetterE : Letter
{
public override string Print() { return "E"; }
}
public class LetterF : Letter
{
public override string Print() { return "F"; }
}
public class LetterFlyWeight
{
public LetterFlyWeight() { }
private Dictionary<string, LetterFlyweight> dic = new Dictionary<string, LetterFlyweight>();
public string Print(string letterName)
{
string _name = "Letter" + letterName;
if (dic.ContainsKey(_name))
{
Console.WriteLine("开始重复使用:" + letterName);
return dic[_name].Print();
}
else
{
Type[] types = Assembly.GetAssembly(typeof(LetterFlyweight)).GetTypes();
foreach (var item in types)
{
if (item.Name == _name)
{
LetterFlyweight letter = (LetterFlyweight)Activator.CreateInstance(item);
dic.Add(_name, letter);
return letter.Print();
}
}
}
return null;
}
}
}

享元模式与其他功能类似模式的区别
与单例模式的区别
- 享元模式是共享大量的实例,而单例模式是一个类一个类的实例。
- 单例模式针对的是对象的创建,而享元模式针对的是对象的管理。
- 单例模式不能单独创建,享元模式是可以的。
与简单工厂模式的区别
- 享元模式在简单工厂模式的基础上加入了缓存。
- 简单工厂模式的作用仅仅是创建对象,而享元模式虽然也是创建对象,但其主要作用是管理对象。
希望大家:点赞,留言,关注咯~
唠家常
今日分享结束啦,小伙伴们你们get到了么,你们有没有更好的办法呢,可以评论区留言分享,也可以加我QQ:841298494,大家一起进步。
- 客官,看完get之后记得点赞哟!
- 小伙伴你还想要别的知识?好的呀,分享给你们
今日推荐
结构型模式 - 享元模式Flyweight的更多相关文章
- 【设计模式】结构型06享元模式(Flyweight Pattern)
享元模式(Flyweight Pattern) 首先吐槽下这个名字,享元?共享元素的话感觉还是蛮好的~但是这个英文... 意图:更好的重用.管理对象,减少内存开销,节约资源. 主要解决:在有大量重复对 ...
- 《精通Python设计模式》学习结构型之享元模式
这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import Enum TreeType = Enum('TreeTye ...
- Java设计模式(5)共享模式/享元模式(Flyweight模式)
Flyweight定义:避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类(元类). 为什么使用共享模式/享元模式 面向对象语言的原则就是一切都是对象,但是如果真正使用起来,有时对象数可 ...
- java设计模式--结构型模式--享元模式
享元模式 概述 运用共享技术有效地支持大量细粒度的对象. 适用性 当都具备下列情况时,使用Flyweight模式: 1.一个应用程序使用了大量的对象. 2.完全由于使用大量的对象,造成很大的存储开销. ...
- [19/04/28-星期日] GOF23_结构型模式(享元模式)
一.享元模式(FlyWeight,轻量级) [共享类与非共享类] /*** *FlyweightFactory享元工厂类: 创建并管理享元对象,享元池一般设计成键值对 */ package cn.sx ...
- Java设计模式(六)合成模式 享元模式
(十一)合成模式 Composite 合成模式是一组对象的组合,这些对象能够是容器对象,也能够是单对象.组对象同意包括单对象,也能够包括其它组对象,要为组合对象和单对象定义共同的行为.合成模式的意义是 ...
- 设计模式理解(十)结构型——享元(Flyweight)
最后一个结构型,享元.没有太多的项目经验,对这种模式只有一种概念上的理解,就是为了节约内存等资源,把可重用的东西只申请一次,然后处处调用,同时用Hash进行管理. 直接上图: 代码: /******* ...
- 【UE4 设计模式】享元模式 Flyweight Pattern
概述 描述 运用共享技术有效地支持大量细粒度对象的复用.系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用. 由于享元模式要求能够共享的对象必须是细粒度对象,因此它又称为轻 ...
- C#设计模式学习笔记:(11)享元模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7792973.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第六个模式--享 ...
- php 23种设计模型 - 享元模式
享元模式 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...
随机推荐
- AK/SK加密认证
AK/SK认证的实现 AK/SK概述 1.什么是AKSK ak/sk是一种身份认证方式,常用于系统间接口调用时的身份验证,其中ak为Access Key ID,sk为Secret Access Key ...
- java学习之springboot
0x00前言 呀呀呀时隔好久我又来做笔记了,上个月去大型保密活动了,这里在网上看了一些教程如果说不是去做java开发我就不做ssm的手动整合了采用springboot去一并开发. Spring Boo ...
- git ignore忽略规则
目录 Git 忽略文件提交的方法 Git 忽略规则 Git 忽略规则优先级 Git 忽略规则匹配语法 常用匹配示例 多级目录忽略规则设置 .gitignore规则不生效 参考文章 Git 忽略文件提交 ...
- ES6高级编程(一)
一.JavaScript概要 1.1.JavaScript组成 JavaScript主要由三部分构成,分别是ECMAScript.DOM与BOM ECMAScript定义了该语言的语法.类型.语句.关 ...
- linux如何删除多余网卡
ifconfig tunl0 down ip link delete tunl0
- Ubuntu 20.04 开启root权限登陆、网卡配置
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying Ubuntu 20.04 开启root权限登陆.网 ...
- vulnhub靶场之Chronos:1
准备: 攻击机:虚拟机kali.本机win10. 靶机:Chronos,下载地址:https://download.vulnhub.com/chronos/Chronos.ova,下载后直接vbox打 ...
- 老板:你为什么要选择 Vue?
大家好,我是 Kagol,Vue DevUI 开源组件库和 EditorX 富文本编辑器创建者,专注于前端组件库建设和开源社区运营. 假如你是团队的前端负责人,现在老板要拓展新业务,需要开发一个 We ...
- Java开发学习(四十八)----MyBatisPlus删除语句之逻辑删除
1.逻辑删除 接下来要讲解是删除中比较重要的一个操作,逻辑删除,先来分析下问题: 这是一个员工和其所签的合同表,关系是一个员工可以签多个合同,是一个一(员工)对多(合同)的表 员工ID为1的张业绩,总 ...
- 基于.NetCore开发博客项目 StarBlog - (21) 开始开发RESTFul接口
前言 最近电脑坏了,开源项目的进度也受到一些影响 这篇酝酿很久了,作为本系列第二部分(API接口开发)的第一篇,得想一个好的开头,想着想着就鸽了好久,索性不扯那么多了,直接开写吧~ 关于RESTFul ...