前端设计模式应用--享元模式

91 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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();

汇总

享元模式提醒我们将一个对象的属性划分为内部和外部状态。享元模式是为了解决性能问题而诞生的设计模式,这和大部分设计模式为了提高程序复用性的原因不太一样,如果系统中因为创建了大量类似对象而导致内存占用过高,享元模式就非常有用了。

优点特性

  • 由于减少了系统中的对象数量,提高了程序运行效率和性能,精简了内存占用,加快运行速度;

  • 外部状态相对独立,不会影响到内部状态,所以享元对象能够在不同的环境被共享;

缺点弊端

  • 引入了共享对象,使对象结构变得复杂;

  • 共享对象的创建、销毁等需要维护,带来额外的复杂度(如果需要把共享对象维护起来的话);