博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之享元模式
阅读量:4032 次
发布时间:2019-05-24

本文共 1896 字,大约阅读时间需要 6 分钟。

享元模式 Flyweight

Intro

享元是指一个可复用的对象,通过复用这个享元来减少应用中的内存分配。

享元模式是为了减少内存占用,尽可能复用已有对象的设计模式,一般来说会把这个可复用的对象放到一个外部的数据结构中,当需要使用到的时候传给享元。

享元模式的意图是复用对象,节省内存,前提是享元对象是不可变对象。

具体来讲,当一个系统中存在大量重复对象的时候,我们就可以利用享元模式,将对象设计成享元,在内存中只保留一份实例,供多处代码引用,这样可以减少内存中对象的数量,以起到节省内存的目的。

实际上,不仅仅相同对象可以设计成享元,对于相似对象,我们也可以将这些对象中相同的部分(字段),提取出来设计成享元,让这些大量相似对象引用这些享元。

Sample

public abstract class Flyweight{    public abstract void Operation(int extrinsicstate);}public class ConcreteFlyweight : Flyweight{    public override void Operation(int extrinsicstate)    {        Console.WriteLine("operation in ConcreteFlyweight");    }}public class UnsharedFlyweight : Flyweight{    public override void Operation(int extrinsicstate)    {        Console.WriteLine("operation in UnsharedFlyweight");    }}public class FlyWeightFactory{    private readonly ConcurrentDictionary
 _flyweights = new ConcurrentDictionary
();    public Flyweight GetFlyweight(string name) => _flyweights.GetOrAdd(name, n => new ConcreteFlyweight());}public class Program{    public static void Main(string[] args)    {        var counter = 20;        var factory = new FlyWeightFactory();        factory.GetFlyweight("X").Operation(counter--);        factory.GetFlyweight("Y").Operation(counter--);        factory.GetFlyweight("X").Operation(counter--);        new UnsharedFlyweight().Operation(counter--);        factory.GetFlyweight("X").Operation(counter--);        Console.WriteLine(counter);        Console.ReadLine();    }}

More

享元模式的代码实现非常简单,主要是通过工厂模式,在工厂类中,通过一个 Dictionary 或数组等 来缓存已经创建好的享元对象,以达到复用的目的 ,可以参考上面的示例。

来看一道经典的 C# 面试题目:

var a = "Hello World";var b = "Hello World";Console.WriteLine(ReferenceEquals(a, b));

想一下输出结果是什么,不确定的话可以试一下哈

CLR 中 string 是一个特殊的类型,string 有一个字符串池(Intern) 的实现就属于是享元模式的体现,这也是上面的输出结果的原因,相同的字符串变量值指向了同一块内存地址

Reference

  • https://github.com/WeihanLi/DesignPatterns/tree/master/StructurePattern/FlyweightPattern

转载地址:http://bazdi.baihongyu.com/

你可能感兴趣的文章
[LeetCode By Python]172. Factorial Trailing Zeroes
查看>>
[LeetCode By MYSQL] Combine Two Tables
查看>>
python jieba分词模块的基本用法
查看>>
[CCF BY C++]2017.12 最小差值
查看>>
[CCF BY C++]2017-12 游戏
查看>>
如何打开ipynb文件
查看>>
[Leetcode BY python ]190. Reverse Bits
查看>>
面试---刷牛客算法题
查看>>
Android下调用收发短信邮件等(转载)
查看>>
Android中电池信息(Battery information)的取得
查看>>
SVN客户端命令详解
查看>>
Android/Linux 内存监视
查看>>
Linux系统信息查看
查看>>
用find命令查找最近修改过的文件
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
在android上运行native可执行程序
查看>>
Phone双模修改涉及文件列表
查看>>
android UI小知识点
查看>>
Android之TelephonyManager类的方法详解
查看>>
android raw读取超过1M文件的方法
查看>>