设计模式之享元模式

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

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;
        }
    }
相关推荐
老码观察1 天前
设计模式实战解读(十一):外观模式——给复杂系统套一层壳
python·设计模式·外观模式
AI大法师1 天前
奥迪 AUDI 案例:母品牌和新业务怎么拆?
大数据·设计模式·汽车
bryant_meng2 天前
【Design Patterns】23 Design Patterns: The Ultimate Developer‘s Toolkit
设计模式·编程·计算机科学·设计·工程
狂人开飞机2 天前
18. 中介者模式(Mediator Pattern)
设计模式·c#·中介者模式
咖啡八杯2 天前
GoF设计模式——外观模式
java·设计模式·外观模式
江湖中的阿龙2 天前
23种设计模式
java·开发语言·设计模式
basketball6162 天前
设计模式入门:7. 策略模式详解 C++实现
c++·设计模式·策略模式
1104.北光c°2 天前
深度剖析 Spring 灵魂:IOC 容器与自动装配的原理、设计与实现
java·开发语言·笔记·后端·spring·rpc·ioc
thisiszdy2 天前
<设计模式> 生产者-消费者模式
设计模式
刀法如飞2 天前
AI时代:DDD领域驱动建模与Ontology语义建模的区别
java·设计模式·架构