持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天
介绍
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
使用场景
-
系统有大量相似对象
-
需要缓冲池的场景。
-
这些对象可以按照内蕴状态分为很多组,当把外蕴对象从对象中剔除出来时,每一组对象都可以用一个对象来代替。
-
系统不依赖于这些对象身份,这些对象是不可分辨的。
应用实践
职责明确
- 抽象享元角色(Flyweight):通常是一个接口或抽象类,在抽象享元类中声明了具体享元类公共的方法,这些方法可以向外界提供享元对象的内部数据(内部状态),也可以通过这些方法来设置外部数据(外部状态)。
- 具体享元(Concrete Flyweight)角色 :实现抽象享元类,称为享元对象;在具体享元类中为内部状态提供了存储空间。通常可以结合单例模式来设计具体享元类,为每一个具体享元类提供唯一的享元对象。
- 非享元(Unsharable Flyweight)角色 :并不是所有的抽象享元类的子类都需要被共享,不能被共享的子类可设计为非共享具体享元类;当需要一个非共享具体享元类的对象时可以直接通过实例化创建。
- 享元工厂(Flyweight Factory)角色 :负责创建和管理享元角色。当客户对象请求一个享元对象时,享元工厂检査系统中是否存在符合要求的享元对象,如果存在则提供给客户;如果不存在的话,则创建一个新的享元对象
实现
abstract class Flyweight {
public abstract doAction(extstate: string): void;
}
class ConcreteFlyweight extends Flyweight {
private intrState: string;
constructor(intrState: string) { super();
this.intrState = intrState; }
public doAction(extstate: string): void { console.log(`享元角色,外部状态为${this.intrState},内部状态为${extstate}`); }
}
interface flyweightObject {
[key: string]: Flyweight
}
class FlyweightFactory {
private flyweights: flyweightObject;
constructor() {
this.flyweights = {};
}
public getFlyweight(intrState: string): Flyweight { if (!this.flyweights[intrState]) { const flyweight: Flyweight = new ConcreteFlyweight(intrState); this.flyweights[intrState] = flyweight; }
return this.flyweights[intrState]; }
}
function main() {
const factory: FlyweightFactory = new FlyweightFactory();
const flyweight1: Flyweight = factory.getFlyweight("test");
const flyweight2: Flyweight = factory.getFlyweight("test");
flyweight1.doAction('state1'); flyweight2.doAction('state2');}
main();
汇总
享元模式提醒我们将一个对象的属性划分为内部和外部状态。享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了。
优点特性
-
由于减少了系统中的对象数量,提高了程序运行效率和性能,精简了内存占用,加快运行速度;
-
外部状态相对独立,不会影响到内部状态,所以享元对象能够在不同的环境被共享;
缺点弊端
-
引入了共享对象,使对象结构变得复杂;
-
共享对象的创建、销毁等需要维护,带来额外的复杂度(如果需要把共享对象维护起来的话);