一 概要
1.1 结构型模式
- 关注类和对象的组合。继承的概念被用来组合接口和定义组合对象,从而获得新功能。
1.2 定义
- 运用共享技术来有効地支持大量细粒度对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大量相似类的开销,从而提高系统资源的利用率。
二 UML类图
三 例子
class Program
{
static void Main(string[] args)
{
Flyweight flyweight = FlyweightFactory.GetFlyweight("qq");
flyweight.Operation();
UnshareConcreteFlyweight unshareConcreteFlyweight = new UnshareConcreteFlyweight();
unshareConcreteFlyweight.Operation();
}
}
public interface Flyweight
{
void Operation();
}
public class ConcreteFlyweight : Flyweight
{
public void Operation()
{
}
}
public class UnshareConcreteFlyweight : Flyweight
{
public void Operation()
{
}
}
public class FlyweightFactory
{
private static Dictionary<string, Flyweight> flyweightDic = new Dictionary<string, Flyweight>();
public static Flyweight GetFlyweight(string key)
{
Flyweight flyweight = null;
if (!flyweightDic.TryGetValue(key, out flyweight))
{
flyweight = new ConcreteFlyweight();
flyweightDic.Add(key, flyweight);
}
return flyweight;
}
}
四 优缺点
4.1 优点
- 能够大幅度地减少需要实例的类的数量。
4.2 缺点
- 为了使对象可以共享,需要将一些不能共享的状态外部化,这将增加程序的复杂性。
五 使用场景
- 系统中存在大量相同或相似的对象,这些对象耗费大量的内存资源。
- 大部分的对象可以按照内部状态进行分组,且可将不同部分外部化,这样每一个组只需保存一个内部状态。
- 由于享元模式需要额外维护一个保存享元的数据结构,所以应当在有足够多的享元实例时才值得使用享元模式。