设计模式之享元模式

享元模式:运用共享技术有效地支持大量细粒度的对象

FlyweightFactory(工厂类)

负责产生和管理Flyweight的组件

内部通常使用容器类来存储共享的Flyweight组件

提供工厂方法产生对应的组件,当产生的是共享组件时,就加入到Flyweight管理容器内

Flyweight(组件接口)

定义组件的操作接口

ConcreteFlyweight(可以共享的组件)

实现Flyweight接口

产生的组件时可以共享的,并加入到Flyweight管理器中

UnsharedConcreteFlyweight(不可以共享的组件)

实现Flyweight接口,也可以选择不继承自Flyweight接口

可以定义为单独的组件,不包含任何共享资源

也可以讲一些共享组件定义为类的成员,成为内部状态;并另外定义其他不被共享的成员,作为外部状态使用

csharp 复制代码
 class Program
    {
        static void Main(string[] args)
        {
            int extrinsicstate = 25;

            FlyweightFactory f = new FlyweightFactory();

            Flyweight fx = f.GetFlyweight("X");
            fx.Operation(--extrinsicstate);


            Flyweight fy = f.GetFlyweight("Y");
            fx.Operation(--extrinsicstate);

            Flyweight fz = f.GetFlyweight("Z");
            fx.Operation(--extrinsicstate);

            Flyweight uf = new UnsharedConcreteFlyweight();

            uf.Operation(--extrinsicstate);


            Console.ReadLine();
        }
    }
    abstract class Flyweight
    {
        public abstract void Operation(int extrinsicstate);

    }

    class ConcreteFlyweight : Flyweight
    {
        public override void Operation(int extrinsicstate)
        {
            Console.WriteLine("具体Flyweight:"+extrinsicstate);
        }
    }

    class UnsharedConcreteFlyweight : Flyweight
    {
        public override void Operation(int extrinsicstate)
        {
            Console.WriteLine("不共享的具体Flyweight:"+extrinsicstate);
        }
    }

    class FlyweightFactory
    {

        private Hashtable flyweights = new Hashtable();
        public FlyweightFactory()
        {
            flyweights.Add("X", new ConcreteFlyweight());
            flyweights.Add("Y", new ConcreteFlyweight());
            flyweights.Add("Z", new ConcreteFlyweight());
        }
        public Flyweight GetFlyweight(string key)
        {
            return ((Flyweight)flyweights[key]);
        }
    }

享元模式的实例

csharp 复制代码
 class Program
    {
        static void Main(string[] args)
        {
            WebSiteFactory f = new WebSiteFactory();

            WebSite fx = f.GetWebSiteCategory("网页");
            fx.Use();

            WebSite fy = f.GetWebSiteCategory("网页");
            fy.Use();

            WebSite fz = f.GetWebSiteCategory("网页");
            fz.Use();


            WebSite f1 = f.GetWebSiteCategory("博客");
            f1.Use();

            WebSite f2 = f.GetWebSiteCategory("博客");
            f2.Use();

            WebSite f3 = f.GetWebSiteCategory("博客");
            f3.Use();


            Console.WriteLine("网站分类总数为{0}",f.GetWebSiteCount());

            Console.ReadLine();
        }
    }

    abstract class WebSite
    {
        public abstract void Use();
    }

    class ConcreteWebSite : WebSite
    {
        private string name = "";

        public ConcreteWebSite(string name)
        {
            this.name = name;
        }
        public override void Use()
        {
            Console.WriteLine("网络分类:"+name);
        }
    }

    class WebSiteFactory
    {
        private Hashtable flyweights = new Hashtable();

        //获得网站分类
        public WebSite GetWebSiteCategory(string key)
        {
            if (!flyweights.ContainsKey(key))
            {
                flyweights.Add(key, new ConcreteWebSite(key));
            }
            return ((WebSite)flyweights[key]);
        }

        //获得网站分离总数
        public int GetWebSiteCount()
        {
            return flyweights.Count;
        }
    }
相关推荐
范中勤3 小时前
技术文档:模型工厂 `llm_provider` / `llm_use` 分层设计
设计模式·langchain·架构设计·模型工厂·llm_provider
浅尝辄止;6 小时前
设计模式在HIS/LIS医疗系统中的完整实践指南(C#版)
开发语言·设计模式·c#
范中勤6 小时前
适配器模式(Adapter Pattern):原理、场景与 LLM 多厂商工程落地
设计模式·架构·langchain·适配器模式·多厂商
408高手17 小时前
23种设计模式
设计模式
沫璃染墨18 小时前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
sarasuki1 天前
MCP 为什么是一个协议而不是一个框架呢?
设计模式·agent·mcp
殷色玫瑰1 天前
C++ STL:map 与 set 详解——从底层红黑树到实际应用
c语言·数据结构·c++·算法·visualstudio·rpc
进化中的刀盾兽1 天前
从零实现 C++ Json-Rpc(九):从 TCP 字节流中拆出完整消息——MuduoBuffer 与 LVProtocol
c++·rpc
geovindu1 天前
rust: Borg Pattern(续)
开发语言·后端·设计模式·rust·博格模式
染指11102 天前
140.Agent-多Agent框架-Agent执行Skills流程
数据库·人工智能·设计模式·langchain·agents