设计模式:享元模式

    科技2022-07-21  116

    在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池(Flyweight Pool)(用于存储具有相同内部状态的享元对象)。在享元模式中,共享的是享元对象的内部状态,外部状态需要通过环境来设置。在实际使用中,能够共享的内部状态是有限的,因此享元对象一般都设计为较小的对象,它所包含的内部状态较少,这种对象也称为细粒度对象。 

    在享元模式中可以共享的相同内容称为 内部状态(Intrinsic State),而那些需要外部环境来设置的不能共享的内容称为 外部状态(Extrinsic State),其中外部状态和内部状态是相互独立的,外部状态的变化不会引起内部状态的变化。由于区分了内部状态和外部状态,因此可以通过设置不同的外部状态使得相同的对象可以具有一些不同的特征,而相同的内部状态是可以共享的。也就是说,享元模式的本质是分离与共享 : 分离变与不变,并且共享不变。把一个对象的状态分成内部状态和外部状态,内部状态即是不变的,外部状态是变化的;然后通过共享不变的部分,达到减少对象数量并节约内存的目的。 

    public interface IFlyweight { void operation(string state); } public class ConcreteFlyweight : IFlyweight { private string intrinsicState; public ConcreteFlyweight(string state) { intrinsicState = state; } public void operation(string state) { Console.WriteLine("Intrinsic State =" + intrinsicState); Console.WriteLine("Extrinsic State =" + state); } } public class FlyweightFactory { public Dictionary<string, IFlyweight> flyweights = new Dictionary<string, IFlyweight>(); public IFlyweight Factory(string state) { IFlyweight value; flyweights.TryGetValue(state, out value); if (value == null) { value = new ConcreteFlyweight(state); flyweights.Add(state, value); } return value; } } public class FlyweightsClient { public void Test() { FlyweightFactory factory = new FlyweightFactory(); IFlyweight fly = factory.Factory("a"); fly.operation("first call"); fly = factory.Factory("b"); fly.operation("second call"); fly = factory.Factory("a"); fly.operation("second call"); } }

    更加详细的解释可以看看:https://blog.csdn.net/justloveyou_/article/details/55045638

    Processed: 0.009, SQL: 8