在 Java 中工厂类是一个广泛使用的设计模式,它相比较直接对类进行实例化来说,具有诸多优势,比如隐藏实例化的具体细节,提供可以配置为其他类的能力,直接返回一个已有的对象而不是直接返回一个新的对象。
import 'dart:math';
abstract class Shape {
factory Shape(String type) {
if (type == 'circle') return Circle(2);
if (type == 'square') return Square(2);
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);
}
// Dart 支持抽象类
// 你可以在一个文本中定义多个类
// dart.math 是一个 Dart 核心库,其余的还有诸如 dart:core,dart:async,dart:convert 和 dart:collection 这样的核心库
// 在 Dart 1.x 的版本中,核心库中的常量是大写的(比如 PI);在 Dart 2 的版本中,都是小写的(pi)。
// 该代码包含了两个 getter 方法,分别用来计算圆的面积和四边形的面积
// num get area => pi * pow(radius, 2); // Circle
// num get area => pow(side, 2); // Square
Shape shapeFactory(String type) {
if (type == 'circle') return Circle(2);
if (type == 'square') return Square(2);
throw 'Can\'t create $type.';
}
main() {
// final circle = Circle(2);
// final square = Square(2);
// final circle = shapeFactory('circle');
// final square = shapeFactory('square');
final circle = Shape('circle');
final square = Shape('square');
print(circle.area);
print(square.area);
}