享元模式(Flyweight Pattern)

 我们知道机器语言识别的只有0和1,我把这两个元素存到一个实例里面,每次使用的时候去调用它,而不是使用的时候直接去new一个对应的对象,这样是非常消耗内存的,我们把这个收藏1和0的容器称之为享元库。

享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度对象的复用

享元模式的结构

Flyweight(抽象享元类):抽象享元类通常是接口或者抽象类声明具体享元类的公共方法,这些方法可以向外界提供享元对象的内部数据(内部状态),也可以通过这些方法设置外部数据(外部状态)

public interface Flyweight
{
    void Operation(string extrinsicState);
}

ConcreteFlyweight(具体享元类):实现抽象享元类,通常称之为享元对象,一般结合单例来设计一个唯一的享元对象。

public class ConcreteFlyweight : Flyweight
{
    private string intrinsicState;

    public ConcreteFlyweight(string intrinsicState)
    {
        this.intrinsicState = intrinsicState;
    }
    public void Operation(string extrinsicState)
    {
    }
}

UnsharedConcreteFlyweight(非共享具体享元类):不是所有的享元对象都被共享,用户可以将不能被共享的对象设置为非共享元,当需要一个非共享具体享元类的时候可以直接实例化创建

public class UnsharedConcreteFlyweight : Flyweight
{
    private string allState;

    public void Operation(string extrinsicState)
    {
    }
}

FlyweightFactory(享元工厂):享元工厂是一个创建管理享元的对象,用户可以直接使用这个享元工厂来调用元素达到复用的效果。一般可以结合工厂模式来进行设计和使用

public class FlyweightFactory
{
    public Hashtable flyweight =new Hashtable(); 
    public Flyweight GetFlyweight(string key)
    {
        if (flyweight.ContainsKey(key))
        {
            return (Flyweight)flyweight[key];
        }
        else
        {
            Flyweight fw = new ConcreteFlyweight("state");
            flyweight.Add(key, fw);
            return fw;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/mango_love/article/details/94292728