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

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

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

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

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

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

看看他们的不同:

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

结构图:

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

原来,一直在用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值