设计模式之享元模式

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

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;
        }
    }
相关推荐
怕浪猫8 小时前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane199410 小时前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
代码小学僧11 小时前
从 0 到 1,记录我的第一个出海 SaaS 独立开发项目
前端·rpc·音视频开发
Zane19941 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..2 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1502 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)3 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki3 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅663 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa3 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio