首页 > 其他分享 >12_享元模式

12_享元模式

时间:2024-03-12 10:00:14浏览次数:28  
标签:享元 12 对象 模式 new 共享 Piece public

享元模式是一种结构型设计模式,它通过共享细粒度的对象来最大限度地减少内存使用和对象创建的数量。享元模式通过将共享对象的状态外部化,使得对象可以共享,并提供了一个工厂类来管理共享对象的创建和获取。

享元模式有五个主要角色:

  1. 享元接口(Flyweight):定义了共享对象的接口,包含了需要外部化的状态的方法。

  2. 具体享元类(Concrete Flyweight):实现了享元接口,并包含内部状态和外部状态。内部状态是可以共享的,而外部状态是不可共享的。

  3. 享元工厂类(Flyweight Factory):用于创建和管理享元对象。它维护了一个享元对象的池,用于存储已创建的享元对象。

  4. 客户端(Client):通过享元工厂类来获取共享对象,并调用共享对象的方法。客户端可以提供外部状态给享元对象。

  5. 非共享具体享元类(Unshared Concrete Flyweight):不可共享的具体享元类,它不实现享元接口。

享元模式的工作原理如下:

  1. 共享对象的状态被外部化,存储在享元对象内部或外部。

  2. 客户端通过享元工厂类获取共享对象,如果对象已存在,则直接返回;如果对象不存在,则创建新的共享对象并加入享元对象池。

  3. 客户端调用共享对象的方法,并传入外部状态。

享元模式的优点包括:

  1. 可以减少内存使用和对象创建的数量,提高系统性能。

  2. 可以共享细粒度的对象,提高系统的复用性。

  3. 可以通过外部化对象状态,使得对象可以共享。

享元模式适用于以下场景:

  1. 当需要创建大量相似的对象,并且对象的某些状态可以外部化时,可以使用享元模式。

  2. 当需要共享对象以减少内存使用时,可以使用享元模式。

总结而言,享元模式通过共享细粒度的对象来减少内存使用和对象创建的数量。它通过外部化对象状态和共享对象的管理来提高系统的性能和复用性。

 

案例:

对于围棋,颜色是内部状态,位置是外部状态

Flyweight

/// <summary>
    /// 抽象享元角色
    /// 定义内部状态和外部状态的接口或实现
    /// </summary>
    public abstract class Piece
    {
        protected string color = string.Empty;//不可共享的享元角色
        public abstract void SetColor();//设置内部状态

        public void Display(Point point)
        {
            SetColor();

            Console.WriteLine($"我的颜色是:{color},我的位置:(x,y)=({point.X},{point.Y})");
        }
    }

 

Concrete Flyweight

/// <summary>
    /// 具体享元角色 -> 黑棋子
    /// </summary>
    public class BlackPiece : Piece
    {
        public override void SetColor()
        {
            color = "黑色棋子";
        }
    }
public class WhitePiece : Piece
    {
        public override void SetColor()
        {
            color = "白色棋子";
        }
    }

 

Flyweight Factory

public class PieceFactory
    {
        //防止实例化,只允许通过静态类获取唯一实例
        private PieceFactory()
        {

        }

        private static readonly PieceFactory instance = new PieceFactory();
        public static PieceFactory Instance=>instance;

        public Hashtable hashtable { get; set; } = new Hashtable();//存储享元对象

        public Piece GetPiece(string key)
        {
            if(hashtable.ContainsKey(key))
            {
                return (Piece)hashtable[key];   //有对象就直接返回对象
            }

            if (key == "黑")
            {
                Piece piece = new BlackPiece();
                hashtable.Add(key, piece);
                return piece;
            }
            else if (key == "白")
            {
                Piece piece = new WhitePiece();
                hashtable.Add(key, piece);
                return piece;
            }
            else
            {
                return null;
            }
        }
    }

 

Client

internal class Client
    {
        public void Start()
        {
            PieceFactory factory = PieceFactory.Instance;

            Piece piece1 = factory.GetPiece("黑");
            Piece piece2 = factory.GetPiece("黑");

            Piece piece3 = factory.GetPiece("白");
            Piece piece4 = factory.GetPiece("白");
            Piece piece5 = factory.GetPiece("白");

            piece1.Display(new System.Drawing.Point(10, 200));
            piece2.Display(new System.Drawing.Point(54, 87));
            piece3.Display(new System.Drawing.Point(66, 77));
            piece4.Display(new System.Drawing.Point(88, 99));
            piece5.Display(new System.Drawing.Point(139, 199));

            Console.WriteLine($"{piece1 == piece2}");
            Console.WriteLine($"{piece3 == piece4}");
            Console.WriteLine($"{piece4 == piece5}");
            Console.WriteLine($"{piece1 == piece3}");
            Console.WriteLine($"hashtable中元素数量:{factory.hashtable.Count}");

        }
    }

调用

static void Main(string[] args)
        {
            new Client().Start();

            Console.ReadKey();
        }

 

 

 

标签:享元,12,对象,模式,new,共享,Piece,public
From: https://www.cnblogs.com/MingQiu/p/18067681

相关文章

  • 11_外观模式
    外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。外观模式通过将客户端与子系统之间的复杂依赖关系解耦,简化了客户端的使用。外观模式有三个主要角色:外观(Facade):提供了一个统一的接口,用于访问子系统中的一组接口。外观封装了子系统的复杂性,简......
  • Redis安装之集群-哨兵模式(sentinel)模式
    官网说明:https://redis.io/docs/management/sentinel/一、背景Redis主从复制模型在一定程度上解决了读写分离、容灾恢复、数据备份、水平扩容支撑高并发的问题,但仍存在单点故障问题,即Mater宕机后,集群将无法提供写服务。二、方案原理主从复制的问题在于Mater宕机后,Slave......
  • 3月12日 新榜情报
    3月12日新榜情报1.抖音2023年短剧付费用户增长超3倍,日均播放量同比增长100%2.抖音55场“超值天团”直播助力抖音商城38好物节3.快手校园联合快手美妆举办“开学爆改挑战”线下路演活动4.快手健康举办“关爱她健康”主题活动5.B站首页现可跳转淘宝直播间6.董宇辉带货华为总......
  • 保护模式
    一、理解保护模式  大多数现代操作系统(包括Windows9X/NT/XP和Linux等)都是多任务的,CPU的保护模式是操作系统实现多任务的基础。了解保护模式的底层原理对学习操作系统有着事半功倍的作用。  保护模式是为了实现多任务而设计的,其名称中的“保护”就是保护任务环境中各个人物......
  • 观察者模式
     观察者:publicinterfaceObserver{voidupdate(floattemperature,floathumidity,floatpressure);}主体;publicinterfaceSubject{publicvoidregisterObserver(Observerobserver);publicvoidremoveObserver(Observerobserver);......
  • leetcode: 2129. 将标题首字母大写
    给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母。请你按以下规则将每个单词的首字母 大写 :如果单词的长度为 1 或者 2 ,所有字母变成小写。否则,将单词首字母大写,剩余字母变成小写。请你返回 大写后 的 title 。示例1:输入:ti......
  • 12. RS485通信协议
    一、RS485简介  RS485(一般称作RS485/EIA-485)隶属于OSI模型物理层,是串行通讯的一种。电气特性规定为2线,半双工,多点通信的类型。它的电气特性和RS-232大不一样。用缆线两端的电压差值来表示传递信号。RS485仅仅规定了接受端和发送端的电气特性。它没有规定或推荐任何数据......
  • debian12.5配置静态IP
    root@debian:~#cat/etc/network/interfaces##Thisfiledescribesthenetworkinterfacesavailableonyoursystem##andhowtoactivatethem.Formoreinformation,seeinterfaces(5).##source/etc/network/interfaces.d/*###Theloopbacknetworkinterface#aut......
  • Windows Server 2012R2 丢失api-ms-win-crt-runtime-l1-1-0.dll
    在网上搜索了很久,没有现成的帖子可以解决。安装补丁不是提示“一个或多个问题导致了安装失败”就是此更新不适用于你的计算机。最终在微软官网读到补丁安装要遵守一个顺序,在此特地把解决过程分享出来,希望能帮助到苦于搜索的人报错信息 无法启动此程序,因为计算机中丢失api-ms......
  • aspnet zero 12 添加登录 验证码
       aspnetzero自带的验证码是基于Google,国内当前无法使用,只能替换国内的。实现后的界面如下图: PackageManagerInstall-PackageLazy.Captcha.Core验证码后端代码publicinterfaceICaptchaAppService:IApplicationService{///<summary>......