设计模式 <结构型型> | 享元模式
享元模式(Flyweight Design Pattern)
享元模式的意图是复用对象,节省内存,当一个系统中存在大量重复对象的时候,就可以利用享元模式,将对象设计成享元,在内存中只保留一份实例,供多处代码引用,这样可以减少内存中对象的数量,以起到节省内存的目的。
享元模式把一个对象的状态分成内部状态和外部状态,常量数据称内在状态,其他对象只可以读取不可以修改。可以随着环境变动的称外部状态,外部状态通常由客户端保存,并在享元对象创建后,需要的时候传入享元对象内部。
结构图:
角色:
- 抽象享元(IFlyweight),接口或抽象类,声明了具体享元类公共方法,可以向外界提供享元对象的内部数据,也可以通过这些方法来设置外部数据。
- 具体享元(ConcreteFlyweight),实现抽象角色定义。
- 适配器(Adapter),管理享元对象池和创建享元对象。
适用场景:
- 有大量享受对象时。
优点:
- 避免重复创建相似对象,节约内存空间。
缺点
- 外部状态会提高代码复杂度,在多线程使用还需要关注线程安全问题。
代码(C#)
譬如有1、2、3个不可变的对象需要复用,就可以使用享元模式,省去了创建对象的过程。
1 |
|
最后
享元模式看起来和单例差不多,但是有本质的区别,在单例模式中,一个类只能创建一个对象,而在享元模式中,一个类可以创建多个对象,每个对象被多处代码引用共享。
对象池、连接池、线程池也是为了复用,但是和享元模式还是有区别的。在任意时刻,每一个对象、连接、线程,并不会被多处使用,而是被一个使用者独占,当使用完成之后,放回到池中,再由其他使用者重复利用。享元模式中在整个生命周期中,都是被所有使用者共享的,主要目的是节省空间。
设计模式 <结构型型> | 享元模式
http://example.com/posts/65163.html