享元模式(Flyweight Pattern)

         共享,即共享访问。如果一个客户改变了某个对象的状态,那么可能会一向所有访问这个对象的客户。当多个客户访问同一个对象时,为了避免客户之间相互影响,最简单最常用的办法就是对客户进行现在,使得客户不能对共享对象进行改变。

        通过为一个共享对象创建一个职责,享元模式可以使多个客户共享一个对象。目的就是使用共享来有效地支持大量的细粒度对象。共享对象可以在多个上下文中使用,每个上下文中都可以作为一个独立的对象来使用,这与非共享对象的实例没有区别,关键的地方在于共享对象有内部状态和外部状态的区别,内部状态存储在共享对象中,独立于上下文信息,所以可以被共享,外部状态取决于上下文,并根据上下文的环境变化而变化,这部分不被共享。当一个程序中使用了大量的对象而造成了很大的存储开销,那么删除这些对象的外部状态,保留下的内部状态构造成一个共享对象来取代大量的对象。

        抽象享元规定出需要实现的公共接口,具体享元实现抽象享元所规定的接口。为了保证对享元对象进行共享,可以使用一个享元工厂且必须使用享元工厂来查找享元。

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

namespace  FlyweightPattern
{
    
//-------------------------------------/
    
//以字符为对象来举例
    
//-------------------------------------/

    
/// <summary>
    
/// 抽象享元类
    
/// </summary>

    public abstract class CharFlyweight
    
{
        
//--内部状态---
        protected string _charName;

        
//--内部状态---
        protected int _width;

        
//--内部状态---
        protected int _height;

        
//--外部状态---
        protected int _style;

        
//--外部状态取决于上下文,并根据上下文的环境变化而变化,这部分不被共享
        public abstract void SetStyle(int style);

        
//显示字体信息
        public abstract void Display();
    }


    
/// <summary>
    
/// 具体享元类
    
/// </summary>

    public class ConcreteCharFlyweight : CharFlyweight
    
{
        
/// <summary>
        
/// 默认的构造函数
        
/// </summary>

        public ConcreteCharFlyweight()
        
{
            
this._charName = "A";
            
this._width = 12;
            
this._height = 16;
        }


        
/// <summary>
        
/// 构造函数
        
/// </summary>
        
/// <param name="charName">名称</param>
        
/// <param name="width"></param>
        
/// <param name="height"></param>

        public ConcreteCharFlyweight(string charName, int width, int height)
        
{
            
this._charName = charName;
            
this._width = width;
            
this._height = height;
        }


        
/// <summary>
        
/// 属于外部状态
        
/// 设置样式
        
/// </summary>
        
/// <param name="style">样式</param>

        public override  void SetStyle(int style)
        
{
            
this._style = style;
        }


        
/// <summary>
        
/// 显示字体信息
        
/// </summary>

        public override  void Display()
        
{
            Console.WriteLine(
"Name:{0}, Width:{1}; Height:{2}; Style:{3}", _charName, _width, _height, _style);
        }

    }


    
/// <summary>
    
/// 享元工厂类
    
/// </summary>

    public class CharFlyweightFactory
    
{
        
private IDictionary<string, CharFlyweight> charactors = new Dictionary<string, CharFlyweight>();

        
public CharFlyweightFactory()
        
{}

        
/// <summary>
        
/// 获得享元对象
        
/// </summary>
        
/// <param name="key"></param>
        
/// <returns></returns>

        public CharFlyweight GetCharFlyweight(string key)
        
{
            CharFlyweight charFlyweight 
= null;
            
if (charactors.ContainsKey(key))
            
{
                charFlyweight 
= charactors[key] as CharFlyweight;
            }

            
else
            
{
                
switch (key)
                
{
                    
case "A":
                        charFlyweight 
= new ConcreteCharFlyweight("A"1216);
                        charactors.Add(key, charFlyweight);
                        
break;
                    
case "B":
                        charFlyweight 
= new ConcreteCharFlyweight("B"1620);
                        charactors.Add(key, charFlyweight);
                        
break;
                }

            }

            
return charFlyweight;
        }

    }


    
/// <summary>
    
/// 客户类
    
/// </summary>

    class Program
    
{
        
static void Main(string[] args)
        
{
            CharFlyweightFactory charFlyweightFactory 
= new CharFlyweightFactory();
            CharFlyweight charFlyweightA 
= charFlyweightFactory.GetCharFlyweight("A");
            charFlyweightA.SetStyle(
1);
            charFlyweightA.Display();
            CharFlyweight charFlyweightB 
= charFlyweightFactory.GetCharFlyweight("B");
            charFlyweightB.SetStyle(
2);
            charFlyweightB.Display();
            Console.ReadLine();
        }

    }

}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值