当前位置:网站首页 / C#开发 / 正文

[AYJS] wpf设计模式学习[21]-享元模式,你一直都在用

时间:2016年05月30日 | 作者 : aaronyang | 分类 : C#开发 | 浏览: 1830次 | 评论 0

讲解:运用共享技术有效地支持大量细粒度的对象。

AY:其实,在一定意义上,我个人认为单例模式和享元模式的初衷是一样的。他们都是一个基于空间和性能的模式。他们都是要控制对象的数量,而且实现方式本质上有着一些类似,就是首先查询这个对象是否存在,然后返回这个对象。

那么从享元模式上的引申,我们就一样可以用到单例模式上了:

1. 我们可以不局限于单例,而是可以控制为多例。比如说:类似我前面对象池的目的

2. 单例只是对象么?我们一样可以把子系统和模块单例!

看看他们的不同:

应该说享元模式是单例模式的一个延伸。享元模式通过享元工厂来控制多个对象的单例化。而单例化解决的只是本身的单例问题!


====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========


结构图:

blob.png

实现很简单,别看图就害怕了。一个键值队列表,例如Has和table维护 一个对象池而已

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StrategyMo.XiangYuan
{
    public abstract class Flyweight
    {
        public abstract void Operation(int extrinsicstate);
    }

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



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




    public 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];
        }
    }

}

客户端:

       int extrinstate = 26;
            FlyweightFactory f = new FlyweightFactory();
            Flyweight fx = f.GetFlyweight("x");
            fx.Operation(--extrinstate);
            Flyweight fy = f.GetFlyweight("y");
            fx.Operation(--extrinstate);
            Flyweight fz = f.GetFlyweight("z");
            fx.Operation(--extrinstate);
            UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
            uf.Operation(--extrinstate);

效果图:

blob.png


1. 系统中要有大量的对象,这才值得用享元模式。否则你去维护一张对象表,就不值得了。

2. 对象的创建是会消耗大量时间的过程,并且对象占用较大内存。如果不是,那就让系统去创建吧。

3. 在B/S的系统中,个人感觉享元的应用相对较少,Web的无状态,加之我们完全在客户端进行一系列的复杂逻辑,然后将之统一传递给Web服务器端,而不需要享元。享元主要应用还是在C/S及Winform的本地程序上较多。



C# string就是用了享元模式,所以说字符串越多,内存消耗越大了,所以说string少用最好,不然占内存。如果设计到字符串拼接,考虑stringbuilder、

blob.png

原来,一直在用

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========








推荐您阅读更多有关于“C#设计模式,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音:wpfui 工作wpf,目前主maui

招聘合肥一枚WPF工程师,跟我一个开发组,10-15K,欢迎打扰

目前在合肥市企迈科技就职

AYUI8全源码 Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始学习WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

标签列表