【问题标题】:Static Factory Methods vs Constructors静态工厂方法与构造函数
【发布时间】:2019-08-29 03:37:49
【问题描述】:

这个问题在评论部分脱轨,更多地与静态工厂方法与构造函数的优势有关

以下面为例

export class User extends Model<UserProps> {

  // Suggested Method (With no constructor)
  static buildUser(attrs: UserProps) : User {
    return new User(new Attributes(attrs), new Eventing(), new ApiSync(rootUrl));
  }

  // why not do it like this instead? No need to call User.buildUser()
  constructor(attrs: UserProps) {
    super(new Attributes(attrs), new Eventing(), new ApiSync(rootUrl));
  }
}

我知道只有实现 buildUser 方法才会隐式调用带有 super 和 args 的构造函数,如果从未定义过构造函数。

但是,buildUser 是否会提供构造函数中的直接超级调用不会提供的某些功能?

似乎只是创建用户的“额外”代码。

let user = User.buildUser(some attr)

let user = new User(some attr);

【问题讨论】:

  • 我想你误解了static 方法是什么。第一种情况就是:let user = User.buildUser(some attr).
  • 是的,我在那里犯了一个错误。即使那样,您也会调用 new User.buildUser(some attr) 与 new User(some attr)。调用 new User(someattr) 似乎更直观
  • 不,在第一种情况下不使用new。该模式称为“静态工厂方法”。谷歌搜索应该会产生一些参考文章。
  • 我一般不知道。我经常在我不想用参数检查之类的东西污染我的构造函数的情况下使用它。
  • 这真的取决于你想要实现什么,以及我相信你的编码风格。它通常很有用,并且在您有多种方式来构造元素的情况下使用,并且您不希望有一个 biiiig 构造函数对每种情况进行所有类型检查等......或者只是为了便于理解。像这个例子。 stackify.com/static-factory-methods

标签: typescript oop inheritance


【解决方案1】:

@Crocsx 提供的答案仅提供了具有静态工厂与构造函数优势的示例。 https://stackify.com/static-factory-methods/

【讨论】:

    【解决方案2】:

    注意:这是一个 OOP 问题,与其说是打字稿问题。我将用 Java 提供我的示例,因为那是我的舒适区。这一切都适用,示例应该足够简单,任何程序员都可以掌握。

    命名

    举个例子:
       final Duration a = new Duration (1); // <-- 1 hour
       final Duration a = new Duration (0, 1); // <-- 1 minute
       final Duration a = new Duration (0, 0, 1); // <-- 1 second
       final Duration a = new Duration (0, 0, 0, 1); // <-- 1 millisecond
    
       final Duration a = Duration.ofHours(1); // <-- 1 hour
       final Duration a = Duration.ofMinutes(1); // <-- 1 minute
       final Duration a = Duration.ofSeconds(1); // <-- 1 second
       final Duration a = Duration.ofMillis(1); // <-- 1 millisecond
    

    静态工厂方法的第一个优点:它们有名字

    缓存

    举个例子:
    private static final Map <Integer, Duration> CACHE = Maps.newHashMap();
    
    public static Duration ofHours(final int value) {
            return Duration.CACHE.computeIfAbsent(
                value, v -> new Duration(v);
            );
        }
    }
    

    静态工厂方法的第二个优势:它们可以缓存

    子类型

    举个例子:
    public static Duration ofHours(final int value) {
    
        if(value < 24)
            return new Duration(value, 0, 0, 0);
        else
            return new MultiDayDuration(...);
    }
    
    public static class MultiDayDuration extends Duration {
       ...
    }
    

    静态工厂方法的第三个优点:它们可以子类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 2018-11-29
      • 2010-10-12
      相关资源
      最近更新 更多