结构型模式 - 享元模式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)主要用于减少创建对象的数量,以减少内存占用和提高性能.这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式. ...
随机推荐
- K8S节点选择器案例
#给节点打上标签 [root@lecode-k8s-master deployment]# kubectl label no lecode-dev-001 hostname=lecode-dev-00 ...
- IOT黑客入门篇之初探Badusb
什么是Badusb? BadUSB是一种使用带有恶意软件编程的USB设备的计算机安全攻击.例如,USB 闪存驱动器可以包含可编程的Intel 8051微控制器,该微控制器可以重新编程,将USB闪存 ...
- golang内置包管理工具go mod简明教程
go mod go buildin package manager. go mod是go语言内置的包管理工具,集成在go tool中,安装好go就可以使用. 要求: go version >= ...
- i春秋123
打开是个普普通通的登录窗口,下尝试根据提示12341234进行输入,发现不正确...可能1234是指步骤,然后查看源码 发现了绿色的提示信息,我们就根据提示试试打开user.php 打开是白板网页,源 ...
- ArcObjects SDK开发 002 写第一个ArcObjects SDK程序
1.开发环境 基于ArcObjects SDK开发,开发环境一般选用Visual Studio,开发语言使用C#,开发包使用ArcObjects SDK for .Net.UI有的使用Winform, ...
- JavaScript入门②-函数(1)基础{浅出}
01.JS函数基础 1.1.函数定义 函数(方法)就是一段定义好的逻辑代码,函数本身也是一个object引用对象.三种函数构造方式: ① 函数申明:function 函数名(参数){代码},申明函数有 ...
- Blazor Server完美实现Cookie Authorization and Authentication
Blazor server-side application用Microsoft.AspNetCore.Identity.EntityFrameworkCore实现Authorization 和 Au ...
- 比 JSON.stringify 快两倍的fast-json-stringify
前言 相信大家对JSON.stringify并不陌生,通常在很多场景下都会用到这个API,最常见的就是HTTP请求中的数据传输, 因为HTTP 协议是一个文本协议,传输的格式都是字符串,但我们在代码中 ...
- PW4052 是一颗适用于单节锂电池的、具有恒压/恒流充电模式的充电管理 IC
PW4052 是一颗适用于单节锂电池的.具有恒压/恒流充电模式的充电管理 IC.该芯片采用开关型的工作模式, 能够为单节锂电池提供快速. 高效且简单的充电管理解决方案.PW4052 采用三段式充电管理 ...
- 五年经验的前端社招被问:CPU 和 GPU 到底有啥区别?
首先来看 CPU 和 GPU 的百科解释: CPU(Central ProcessingUnit,中央处理器):功能主要是解释计算机指令以及处理计算机软件中的数据 GPU(Graphics Proce ...