当前位置: 首页 > 知识库问答 >
问题:

理解工厂构造函数代码示例-Dart

邹涵畅
2023-03-14

关于这里提到的工厂构造函数示例,我有一些小问题(https://www.dartlang.org/guides/language/language-tour#factory-constructors)。我知道在基本层面上只有三种类型的构造函数 - 默认,命名和参数化。

  1. 在本例中,为什么要使用<code>工厂
  2. 这是正在使用的命名构造函数吗?为什么

共有3个答案

上官正志
2023-03-14

补充Dave的回答,这段代码显示了一个使用工厂返回父类相关类的清晰示例。

看看 https://codelabs.developers.google.com/codelabs/from-java-to-dart/#3 的这段代码

您可以在这里运行此代码。https://dartpad.dartlang.org/63e040a3fd682e191af40f6427eaf9ef

做一些改变,以了解它在某些情况下是如何工作的,比如单例。

import 'dart:math';

abstract class Shape {
  factory Shape(String type) {
    if (type == 'circle') return Circle(2);
    if (type == 'square') return Square(2);
    // To trigger exception, don't implement a check for 'triangle'.
    throw 'Can\'t create $type.';
  }
  num get area;
}

class Circle implements Shape {
  final num radius;
  Circle(this.radius);
  num get area => pi * pow(radius, 2);
}

class Square implements Shape {
  final num side;
  Square(this.side);
  num get area => pow(side, 2);
}

class Triangle implements Shape {
  final num side;
  Triangle(this.side);
  num get area => pow(side, 2) / 2;
}

main() {
  try {
    print(Shape('circle').area);
    print(Shape('square').area);
    print(Shape('triangle').area);
  } catch (err) {
    print(err);
  }
}
李谦
2023-03-14

1)静态方法和工厂构造函数没有太大区别。

对于工厂构造函数,返回类型固定为类的类型,而对于静态方法,您可以提供自己的返回类型。

工厂构造函数可以通过<code>new

(工厂)构造函数支持像重定向这样很少使用的特性,但静态方法不支持。

使用工厂构造函数来创建类的实例而不是静态方法可能仍然是一种很好的做法,以使对象创建的目的更加明显。

这就是在您发布的示例中使用工厂构造函数的原因,可能是因为代码最初是在Dart 1中编写的,它允许使用<code>new

2)是的,这是一个命名构造函数,前缀_使其成为私有命名构造函数。只有命名构造函数才能成为私有的,因为否则就没有地方添加_前缀。

它用于防止从公共工厂构造函数以外的任何地方创建实例。这样可以确保您的应用程序中不能有多个Logger实例。工厂构造函数仅在第一次创建实例,对于后续调用,始终返回之前创建的实例。

史朗
2023-03-14

TL;dr在不一定要返回类本身的新实例的情况下使用工厂。使用案例:

    < li >构造函数开销很大,所以如果可能的话,您希望返回一个现有的实例,而不是创建一个新的实例。 < li >您只想创建一个类的实例(单例模式); < li >您希望返回子类实例,而不是类本身。

解释说明

Dart类可能具有生成构造函数或工厂构造函数。生成构造函数是始终返回类的新实例的函数。因此,它不使用返回关键字。常见的生成构造函数的形式如下:

class Person {
  String name;
  String country;

  // unnamed generative constructor
  Person(this.name, this.country);
}
var p = Person("...") // returns a new instance of the Person class

工厂构造函数比生成式构造函数具有更宽松的约束。工厂只需要返回一个与类类型相同或实现其方法的实例(即满足其接口)。这可以是该类的一个新实例,但也可以是该类的一个现有实例或一个子类的新/现有实例(它必须具有与父类相同的方法)。工厂可以使用控制流来确定返回什么对象,并且必须利用< code>return关键字。为了让工厂返回一个新的类实例,它必须首先调用一个生成式构造函数。

在您的示例中,未命名的工厂构造函数首先从名为 _cache 的 Map 属性读取数据(由于该属性是静态的,因此存储在类级别,因此独立于任何实例变量)。如果实例变量已存在,则返回该变量。否则,通过调用命名的生成构造函数Logger._internal生成新实例。此值将被缓存,然后返回。由于生成构造函数仅采用 name 参数,因此 mute 属性将始终初始化为 false,但可以使用默认的 setter 进行更改:

var log = Logger("...");
log.mute = true;
log.log(...); // will not print

术语 factory 暗指工厂模式,它完全是关于允许构造函数根据提供的参数返回子类实例(而不是类实例)。Dart中此用例的一个很好的例子是抽象的HTML Element类,它定义了数十个返回不同子类的命名工厂构造函数。例如,Element.div()Element.li() 返回

在这个缓存应用程序中,我发现“工厂”有点用词不当,因为它的目的是避免调用生成构造函数,我认为现实世界的工厂本质上是生成的。也许这里更合适的术语是“仓库”:如果一件物品已经有了,就把它从货架上拿下来交付。如果没有,请换一个新的。

所有这些与命名构造函数有什么关系?生成构造函数和工厂构造函数既可以是未命名的,也可以是命名的:

...
  // named generative
  // delegates to the default generative constructor
  Person.greek(String name) : this(name, "Greece"); 

  // named factory 
  factory Person.greek(String name) {
    return Greek(name);
  }
}

class Greek extends Person {
  Greek(String name) : super(name, "Greece");
}


 类似资料:
  • 本文向大家介绍JavaScript中工厂函数与构造函数示例详解,包括了JavaScript中工厂函数与构造函数示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 当谈到JavaScript语言与其他编程语言相比时,你可能会听到一些令人困惑东西,其中之一是工厂函数和构造函数。 工厂函数 所谓工厂函数,就是指这些内建函数都是类对象,当你调用他们时,实际上是创建了一个类实例”。意思就是当我调用这个函

  • 如果我理解正确: 例如: 以上允许我这样做: 这也阻止了我这样做: 因此,如果我对所有这些都是正确的,我会问为什么动物的额外代码? 如果您打算为只创建cat的动物使用工厂构造函数,为什么不只是拥有一个具有所需方法/属性的Cat类呢? 或者,像上面这样带有工厂构造函数的动物类的目的真的是专为Cat类设计的接口吗?

  • 问题内容: 有人可以澄清Javascript中的构造函数和工厂函数之间的区别。 何时使用一个代替另一个? 问题答案: 基本区别在于,构造函数与关键字一起使用(这会使JavaScript自动创建一个新对象,在该函数内将该对象设置为该对象,然后返回该对象): 工厂函数的调用类似于“常规”函数: 但是要使其成为“工厂”,就需要返回某个对象的新实例:如果它仅返回布尔值或其他内容,则不会将其称为“工厂”函数

  • 在Dart中,工厂构造函数需要编码器提供更多逻辑,但与常量构造函数没有太大区别,只是它们允许“非最终”实例变量。 与const Constructor相比,它们有哪些优点? 谢谢大家。 编辑 下面是关于Seth Ladd博客“Dart-试图理解“工厂”构造函数的价值”中工厂构造函数的用法。 恕我直言,使用通用构造函数,可以通过细微的差异实现相同的效果,但相当简单。 如上所示,尽管这两个实例 所以,

  • 下面是关于Seth Ladd博客“Dart”中工厂构造器的使用-试图理解“工厂”构造器值。 在IMHO中,使用通用构造器,可以通过细微的差异实现相同的效果,但非常简单。 如上所示,尽管这两个实例 所以,我的问题是工厂构造函数(或工厂模式)比一般/const构造函数有什么特殊的优点?因为上面的示例代码本身并没有显示工厂构造函数的优点。 谁能解释一下在Dart语言而不是Java / C#中所谓的“工厂

  • 问题内容: 有效的Java说“考虑提供静态工厂方法而不是构造函数” 如果你有一个 为类A提供此方法是否有意义,而不是在代码中调用new A()。 问题答案: 请参阅此处以很好地说明您可能要执行此操作的主要原因。综上所述: 命名为“构造函数”。 如果合适,可以返回null。 如果合适,可以返回派生类的实例。 在实例化泛型类型的变量时减少冗长。 我想到了本文没有提及的另一个原因:可以实现有趣的逻辑来避