Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在模型中使用单例的缺点_Javascript_Design Patterns - Fatal编程技术网

Javascript 在模型中使用单例的缺点

Javascript 在模型中使用单例的缺点,javascript,design-patterns,Javascript,Design Patterns,假设我正在制作一个React Redux应用程序来处理一个库。我想为我的后端创建一个API,其中每个模型(书籍、作者等)都显示在UI中。 每个模型都不提供公共构造函数,而是提供一个from静态函数,该函数确保每个id只存在一个实例: static from (id: string) { if (Books.books[id]) { return Books.books[id]; } return Book.books[id] = new Book(id); } 每个模型都提

假设我正在制作一个React Redux应用程序来处理一个库。我想为我的后端创建一个API,其中每个模型(书籍、作者等)都显示在UI中。 每个模型都不提供公共构造函数,而是提供一个from静态函数,该函数确保每个id只存在一个实例:

static from (id: string) {
  if (Books.books[id]) {
    return Books.books[id];
  }
  return Book.books[id] = new Book(id);
}

每个模型都提供一个异步获取函数,该函数将使用后端获取其道具。其优点是没有数千个实例,而且我不必获取两次(如果我的应用程序的两个部分需要相同的模型,那么实际上只需调用一次获取)。但是我没有发现任何缺点,除了获取其模型的代码和假设它们仍然没有被获取的代码之间可能存在差异,但我仍然不知道这什么时候才是真正的问题。我可以想到两个问题:

  • 你的模型是可变的吗?如果更改实例的属性,它将反映使用该实例的所有地方。这可能是可取的,也可能根本不可取。使用方法中的
    ,您将无能为力。
    如果您的模型是不可变的,那么共享实例实际上是一种常见做法,也称为
  • 你的实现像地狱一样泄漏内存。这些实例将保持从该
    书籍
    数组/对象中引用,即使不再需要它们

    • 我可以想到两个问题:

      • 你的模型是可变的吗?如果更改实例的属性,它将反映使用该实例的所有地方。这可能是可取的,也可能根本不可取。使用方法中的
        ,您将无能为力。
        如果您的模型是不可变的,那么共享实例实际上是一种常见做法,也称为
      • 你的实现像地狱一样泄漏内存。这些实例将保持从该
        书籍
        数组/对象中引用,即使不再需要它们
      但我没有发现任何缺点

      我至少看到两个:

      • 单例模式是一种反模式。
        静态工厂方法不提供显式依赖项。
        在单元测试中模拟该方法或切换到另一个实现将更加困难

      • 您没有缓存大小限制。
        对于短名单,这是可以的。 但是,如果可以缓存多个对象,则应该只保留最近使用的实例

      但我没有发现任何缺点

      我至少看到两个:

      • 单例模式是一种反模式。
        静态工厂方法不提供显式依赖项。
        在单元测试中模拟该方法或切换到另一个实现将更加困难

      • 您没有缓存大小限制。
        对于短名单,这是可以的。 但是,如果可以缓存多个对象,则应该只保留最近使用的实例


      模型有时应该提供一个功能,如果你的意思是可以修改它的一个道具。我喜欢这种方式,因为每个模型持有者都会使用最新的对象,而且它还可以提供一个简单的API来侦听更改(然后更改组件的状态,最终更新视图)。是的,这就是我的意思。一切都是最新的是好的,除非你不想要它。您无法控制是否使用此功能-由
      from
      函数决定。此外,模型会在任何时候简单地改变,没有可观察的界面,因此你可以显式地监听更新。模型有时应该提供一个函数,如果你的意思是可以修改它的一个道具。我喜欢这种方式,因为每个模型持有者都会使用最新的对象,而且它还可以提供一个简单的API来侦听更改(然后更改组件的状态,最终更新视图)。是的,这就是我的意思。一切都是最新的是好的,除非你不想要它。您无法控制是否使用此功能-由
      from
      函数决定。此外,模型会在任意时间简单地更改,没有可观察的接口,因此您可以显式地侦听更新。