标签:代码 利用 状态 new 子类 问题 资源 add code
在软件开发过程中,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次去申请内存空间了,这样可能出现内存使用越来越多的情况,这样的问题是非常严重,然而亨元模式可以解决这个问题,下面我们一起具体看看亨元模式是如何解决这个问题的。
既然亨元模式可以解决重复使用new创建对象的问题,下面让我们分析下如何去解决上面那个问题,既然都是同一个对象,能不能只创建一个对象,然后下次需要创建这个对象的时候,让它直接用已经创建好了的对象就好了呢,也就是说让一个对象共享。这个也是亨元模式的实现精髓所在。
2.1 定义
介绍完享元模式的精髓之后,让我们具体看看享元模式的正式定义:
亨元模式——利用共享技术有效地支持大量细粒度的类实例来表示数据,亨元模式可以避免大量相识类的开销,在软件开发过程中如果需要大量细粒度的类实例来表示数据,而这些实例除了几个参数外基本相同,这时候就可以使用亨元模式来大幅度减少需要类的实例数量。如果能把这些参数(指的这些类实例的不同参数)移动到类实例外面,在方法调用时将他们传入尽量,这样就可以通过共享大幅度减少单个实例的数目,然而我们把类实例外面的参数称为亨元对象的外部状态,把亨元对象内部参数称为内部状态,
2.2 亨元模式结构图
2.3 亨元模式的组成
2.4亨元模式代码实现
Flyweight类,它是所有具体亨元类的超类或接口,通过这个接口,Flyweight可以接受并作用于外部状态
public abstract class Flywieght { public abstract void Operation(int extrinsicstate); }
ConcreteFlyweight是继承Flyweight超类或实现Flyweight接口,并为内部状态增加存储空间。
public class ConcreteFlyweight:Flywieght { public override void Operation(int extrinsicstate) { Console.WriteLine("具体的"+extrinsicstate); } }
UnsharedConcreteFlyweight是 指那些不需要共享的Flyweight子类,因为Flyweight接口让共享成为可能,但它并不强制共享
public class UnsharedConcreteFlyweight:Flywieght { public override void Operation(int extrinsicstate) { Console.WriteLine("不共享的具体Flywieght"+extrinsicstate); } }
public class FlyweightFactory { private Hashtable flyweights = new Hashtable(); public FlyweightFactory() { flyweights.Add("X",new ConcreteFlyweight()); flyweights.Add("Y", new ConcreteFlyweight()); flyweights.Add("Z", new ConcreteFlyweight()); } public Flywieght GetFlyweight(string key) { return ((Flywieght)flyweights[key]) ; } }
客户端代码
class Program { static void Main(string[] args) { int extrinsincstate = 10; FlyweightFactory f = new FlyweightFactory(); Flywieght fx = f.GetFlyweight("X"); fx.Operation(--extrinsincstate); Flywieght fy = f.GetFlyweight("Y"); fy.Operation(--extrinsincstate); Flywieght fz = f.GetFlyweight("Z"); fz.Operation(--extrinsincstate); UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight(); uf.Operation(--extrinsincstate); Console.Read(); } }
结果表示
具体的9 具体的8 具体的7 不共享的具体Flywieght6
面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight设计模式主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。
Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理。
对象的数量太大从而导致对象内存开销加大——什么样的数量才算大?这需要我们仔细的根据具体应用情况进行评估,而不能凭空臆断。
满足上面的条件的系统可以使用享元模式。但是使用享元模式需要额外维护一个记录子系统已有的所有享元的表,而这也需要耗费资源,所以,应当在有足够多的享元实例可共享时才值得使用享元模式。
通过迭代来使用模式,别为了模式而模式
标签:代码 利用 状态 new 子类 问题 资源 add code
原文地址:https://www.cnblogs.com/studydp/p/9539652.html