zoukankan      html  css  js  c++  java
  • 创建和销毁对象考虑用静态方法代替构造器

    当创建对象时,直接使用构造器是最自然不过的事情,但不妨考虑一下静态工厂方法。

    注:区别于设计模式中的工厂方法,它只是一个静态的方法而已;设计模式中的工厂方法通常包括商品和工厂两个组件,没那么复杂。

    因为它可以为你带来以下构造器所不能提供的优势

    1. 有名称

      场景:构造器的命名都一致

      当一个类需要提供多个构造器时,通常只是通过不同的入参加以区分,但其函数名还是相同的,无法提供较高的区分度。

      这时,不妨考虑用静态工厂方法代替构造器,并且慎重地选择名称以便突出它们之间的区别。

    2. 不必在每一次创建时都提供新对象

      场景:调用构造器时每次都创建新对象

      这一点很显然,我们知道Singleton其实也提供一个静态工厂方法获取实例。

      除此之外,可以用==代替equals()方法,达到性能的提升。

    3. 返回子类型

      场景:构造器只能返回当前类的实例,无法返回子类的实例。

      这个优点的确很有用,能狗充分利用多态,使代码更具有可扩展性。

      设计模式中的工厂方法也有体现,可根据入参type返回类型为Types的不同子类实例。

    1 public Types getType(String type) {...}

    4. 使代码更加简单

      场景: Java的泛型类在实例化时,还是需要写两次类型参数,非常冗长

      静态工厂方法可以帮你改善这种情况:

      举个例子,假设在HashMap类中提供如下静态工厂方法:

    1 public static <k, v> HashMap<k, v> getInstance() {
    2   return new HashMap<k, v>();  
    3 }

      那么,调用时应该是这样的:

    HashMap<Stirng, List<String>> m = HashMap.newInstance();

      但现实确实这样的,非常啰嗦:

    HashMap<String, List<String>> m = new HashMap<String, List<String>>();

    但是,我们也应该很清楚的认识到使用静态工厂方法带来的隐患

    1. 如果类中没有提供public或protected的构造器,将造成该类不能子类化

      不能子类化在某些情况下是无法接受的,但是,这样也有好处:策略模式教导我们应该多用组合而不是继承,当一个类不能子类化后,组合将是你唯一的选择。

      

    2. 静态工厂方法和其他静态方法本质上并没有区别

      前已经述及,静态工厂方法本质上就是一个静态方法。这使得使用人员在查阅JavaDoc时,可能将其和一般的静态方法混淆,造成使用上的困扰。

    总结:

      鉴于构造器有各种各样的不便,可以考虑用静态方法代替。它会给我们带来以下优缺点:

       优点:

        1) 有名称;

        2)不必在每一次创建时都提供新对象;

        3) 返回子类型;

        4) 使代码更加简单。

       缺点:

        1)如果类中没有提供public或protected的构造器,将造成该类不能子类化;

        2)静态工厂方法和其他静态方法本质上并没有区别。

        

  • 相关阅读:
    tips
    【十大算法实现之KNN】KNN算法实例(含测试数据和源码)
    智力趣题几则
    JAVA知多少
    R语言(入门小练习篇)
    文本分类,数据挖掘和机器学习
    推荐系统的循序进阶读物(从入门到精通)
    【贪心】PAT 1033. To Fill or Not to Fill (25)
    博弈故事一则——海盗分金币问题
    基于WordNet的英文同义词、近义词相似度评估及代码实现
  • 原文地址:https://www.cnblogs.com/forstudy/p/3061913.html
Copyright © 2011-2022 走看看