共享,即共享访问。如果一个客户改变了某个对象的状态,那么可能会一向所有访问这个对象的客户。当多个客户访问同一个对象时,为了避免客户之间相互影响,最简单最常用的办法就是对客户进行现在,使得客户不能对共享对象进行改变。
通过为一个共享对象创建一个职责,享元模式可以使多个客户共享一个对象。目的就是使用共享来有效地支持大量的细粒度对象。共享对象可以在多个上下文中使用,每个上下文中都可以作为一个独立的对象来使用,这与非共享对象的实例没有区别,关键的地方在于共享对象有内部状态和外部状态的区别,内部状态存储在共享对象中,独立于上下文信息,所以可以被共享,外部状态取决于上下文,并根据上下文的环境变化而变化,这部分不被共享。当一个程序中使用了大量的对象而造成了很大的存储开销,那么删除这些对象的外部状态,保留下的内部状态构造成一个共享对象来取代大量的对象。
抽象享元规定出需要实现的公共接口,具体享元实现抽象享元所规定的接口。为了保证对享元对象进行共享,可以使用一个享元工厂且必须使用享元工厂来查找享元。
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", 12, 16);
charactors.Add(key, charFlyweight);
break;
case "B":
charFlyweight = new ConcreteCharFlyweight("B", 16, 20);
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();
}
}
}
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", 12, 16);
charactors.Add(key, charFlyweight);
break;
case "B":
charFlyweight = new ConcreteCharFlyweight("B", 16, 20);
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();
}
}
}