享元模式就是运行共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销(如耗费内存),使大家共享一个类。在享元模式中有两个重要的概念,即内部状态和外部状态:
由于享元模式区分了内部状态和外部状态,所以我们可以通过设置不同的外部状态使得相同的对象可以具备一些不同的特性,而内部状态设置为相同部分。
享元模式包含以下角色:
苹果公司批量生产 iPhone11,iPhone11 的大部分属性比如型号、屏幕都是一样,少部分属性比如内存有分 128、256G 等。未使用享元模式前,我们写如下代码:
在以上代码中,我们创建了一万个 iPhone11,每个 iPhone11 都独立占有一个内存空间。 但是我们仔细观察可以看到,大部分 iPhone11 都是类似的,只是内存和序列号不一样,如果是一个对性能要求比较高的程序,我们就要考虑去优化它。
当存在大量相似对象的程序,我们就可以考虑用享元模式去优化它,我们分析出大部分的 iPhone11 的型号、屏幕、内存都是一样的,那么这部分数据就可以共用,这就是享元模式中的内在数据,因此定义 iPhone11 对应的享元类如下:
class IphoneFlyweight {
constructor(model: string, screen: number, memory: number) {}
}
我们定义了 IphoneFlyweight 享元类,其中包含型号、屏幕、内存三个数据。我们还需要一个享元工厂来维护这些数据:
class FlyweightFactory {
private phonesMap: { [s: string]: IphoneFlyweight } = {};
public get(model: string, screen: number, memory: number): IphoneFlyweight {
const key = model + screen + memory;
if (!this.phonesMap[key]) {
this.phonesMap[key] = new IphoneFlyweight(model, screen, memory);
}
return this.phonesMap[key];
}
}
在这个工厂中,我们定义了一个对象来保存享元对象,并提供一个方法根据参数来获取享元对象,如果 phonesMap 对象中有则直接返回,没有则创建一个返回。
定义 IphoneFlyweight 类
/**
* 内部状态:model, screen, memory
* 外部状态:sn
*/
class IphoneFlyweight {
constructor(model: string, screen: number, memory: number) { }
}
定义 FlyweightFactory 类
class FlyweightFactory {
private phonesMap: { [s: string]: IphoneFlyweight } = {};
public get(model: string, screen: number, memory: number): IphoneFlyweight {
const key = model + screen + memory;
if (!this.phonesMap[key]) {
this.phonesMap[key] = new IphoneFlyweight(model, screen, memory);
}
return this.phonesMap[key];
}
}
定义 Iphone 类
class Iphone {
constructor(flyweight: IphoneFlyweight, sn: number) { }
}
定义 IphoneFactory 类
class IphoneFactory {
private static flyweightFactory: FlyweightFactory = new FlyweightFactory();
public getIphone(
model: string,
screen: number,
memory: number,
sn: number
) {
const flyweight: IphoneFlyweight = IphoneFactory.flyweightFactory.get(
model,
screen,
memory
);
return new Iphone(flyweight, sn);
}
}
function show(): void {
const iphoneFactory = new IphoneFactory();
const phones = [];
for (let i = 0; i < 10000; i++) {
let memory = i % 2 == 0 ? 128 : 256;
phones.push(iphoneFactory.getIphone("iPhone11", 6.1, memory, i));
}
console.log("Already created 10000 iPhone11");
}
最后我们来看一下未使用享元模式(左图)和使用享元模式(右图)的代码:
在前面的 iPhone 示例中,我们定义了 IphoneFlyweight 享元类,其中包含型号、屏幕、内存三个内部状态。而对于外部状态如手机编号 sn,我们重新定义另一个 Iphone 类来包含该外部状态。在创建 Iphone 对象时,在型号、屏幕和内存相同的情况下,会共享由 IphoneFlyweight 享元类创建的享元对象。
享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。
前后端分离从端口划分就是将浏览器、客户端分为前端,提供真实服务的软件就成为后端。从开发语言的角度划分后端的编程语言和前端的编程语言,例如Java是做后端真实数据服务的,JavaScript、HTML是做前端业务数据的展现与用户行为操作的
当数据同时具备多个属性/分类时,改如何设计表结构和查询?我这样写数据少了还好,多了根本没法查,效率太低了。恰好我以前做过类似的业务需求设计,所以就回复了这个问题。
提供一个通用的接口来创建对象,适用场景;当对象或组建设置涉及高复杂性时;当需要根据所在当不同环境轻松生成对象当不同实例时;当处理很多共享相同属性当小型对象或组件时
随着你的 JavaScript 应用越来越复杂,你很可能会在 development 和 production 模式下,分别加载和执行不同的代码逻辑。能够在 development 和 production 模式下,分别打包或执行不同的代码,是一种非常强大的能力
单例模式是我们开发中一个非常典型的设计模式,js单例模式要保证全局只生成唯一实例,提供一个单一的访问入口,单例的对象不同于静态类,我们可以延迟单例对象的初始化,通常这种情况发生在我们需要等待加载创建单例的依赖。
Mixin模式就是一些提供能够被一个或者一组子类简单继承功能的类,意在重用其功能。在面向对象的语言中,我们会通过接口继承的方式来实现功能的复用。
我觉得聊一下我爱用的 JavaScript 设计模式应该很有意思。我是一步一步才定下来的,经过一段时间从各种来源吸收和适应直到达到一个能提供我所需的灵活性的模式。让我给你看看概览,然后再来看它是怎么形成的
观察者模式定义了一种一对多的对象依赖关系,当被依赖的对象的状态发生了改变,所有依赖它的对象都会得到通知;假如你去苹果专卖店买最新款的iphone11,因为iphone11刚出来不久,正处旺季,供货不足;
确保只有一个实例提供全局访问,代理的作用是实现一个实例的逻辑;惰性单例顾名思义就是在我们需要的时候在去创建这个单例
说人话,就是在原有功能不变的前提下要加功能、加需求,不是去动写好的函数,而是想办法扩展。这个想出来的办法就是装饰器模式。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!