Java 考虑为施工人员提供静态工厂方法

Java 考虑为施工人员提供静态工厂方法,java,Java,类允许客户端获取实例的通常方法是提供公共构造函数。另一种方法是提供一个公共静态工厂方法,它只是一个返回类实例的静态方法。使用静态工厂方法的优点和缺点是什么?这一章从《有效的Java》一书中很好地解释了这一点:。它以你能理解的最好方式解释了它们的所有优点和缺点 仅引用本书中的优点和缺点: 优势: 静态工厂方法的一个优点是,与构造函数不同,它们有名称 静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时创建新对象 静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任

类允许客户端获取实例的通常方法是提供公共构造函数。另一种方法是提供一个公共静态工厂方法,它只是一个返回类实例的静态方法。使用静态工厂方法的优点和缺点是什么?

这一章从《有效的Java》一书中很好地解释了这一点:。它以你能理解的最好方式解释了它们的所有优点和缺点

仅引用本书中的优点和缺点:

优势

  • 静态工厂方法的一个优点是,与构造函数不同,它们有名称
  • 静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时创建新对象
  • 静态工厂方法的第三个优点是,与构造函数不同,它们可以返回其返回类型的任何子类型的对象
  • 静态工厂方法的第四个优点是,它们减少了创建参数化类型实例的繁琐性(在Java7中可以忽略这一点)
缺点

  • 只提供静态工厂方法的主要缺点是,没有公共或受保护构造函数的类不能被子类化

  • 静态工厂方法的第二个缺点是它们不容易与其他静态方法区分开来


你可以在我提供的链接中对它们进行更详细的研究。

唯一的缺点是要编写更多的代码,但它仍然存在,因此你至少需要从拥有工厂中获得一些好处

工厂不需要总是返回新对象,这是一个优势

工厂可以实例化它想要的任何子类,这是另一个

在我的项目中,我经常添加工厂,只是为了让我的客户机代码看起来更好。如果对factory方法使用静态导入,则调用看起来比新的表达式更好,尤其是如果类的名称不是特别简洁,通常情况下更是如此。

优点: -静态工厂方法的一个优点是,与构造函数不同,它们有名称。 -静态工厂方法的第二个优点是,与构造函数不同,它们不需要在每次调用时创建新对象。 -它们可以返回其返回类型的任何子类型的对象。 缺点: -静态工厂方法的主要缺点是没有公共或受保护构造函数的类不能被子类化。
-它们不容易与其他静态方法区分。

我想对问题的原始作者说,静态工厂方法是一种工具。与所有工具一样,它们也有最适合的用途,其他用途也可以,其他用途适应性较差。举一个现实世界的例子,锤子很擅长钉钉子,足以顶开一个带钉子移除端的密封板条箱(撬棍还是更好),但对于刨下粗糙表面毫无用处

工厂方法是指一组创造性设计模式中的一种,即创建对象的范例。在一些创造性的设计模式中,例如“Builder”和“Prototype”,使用新的操作符创建对象不仅是不受鼓励的,而且被认为对总体设计目标有害。人们谈论的创意设计模式是

  • 工厂方法
  • 抽象工厂方法
  • 单态模式
  • 建筑商
  • 原型
  • 一般来说,工厂方法用于根据用户或设计人员提供给方法的数据从一组相关子类创建对象。但更具体地说,静态工厂方法使您能够控制对象创建,即使每次返回的对象都是相同的。例如,当创建对象的过程在时间和资源方面非常昂贵时,这可能非常重要。在这种情况下,使用新操作符创建对象可能会导致严重的性能损失

    一种解决方案可能是维护一个可重用的对象池。通过使用静态工厂方法,应用程序设计器可以提供逻辑来返回可用的现有自由对象。这样可以节省构建新对象的潜在高成本。这正是提供“连接池”的连接管理器对网络数据库连接所做的。连接对象不是每次客户端发出请求时都构建新的数据库连接,而是从现有对象池(如果有的话)中分配。这是一个例子,在这种情况下,使用新的操作符实际上会对应用程序性能有害,并且会破坏软件工程师的设计目标

    考虑使用工厂方法来创建对象而不是新操作符的好时机是:

    • 将要创建的对象属于可以根据提供的数据创建的对象的少数可能子类之一
    • 有一个很好的理由对对象创建过程进行比构造函数更多的控制,例如,单例设计模式需要静态工厂方法
    <> P>使用工厂方法的一个不好的时间是:

    • 简单、轻量级的对象

    这一切都是关于列举软件设计问题,然后决定哪些工具最适合解决它。静态工厂方法对某些事情是好的,而对其他事情不是那么好。。。与任何工具一样。

    优点之一是可以为工厂方法提供可理解的名称。它将帮助您轻松理解函数中的函数,并便于将来维护代码。看看这个例子
        public class Contact {
    
        private Contact(String displayName, String phoneNumber, int contactType){
        //do something
        }
    
        //then we will have few functon static to get constructor private
        public static createContactUnknow(String phoneNumber){
            return new Contact("","00000000",0);
        }
    
        public static createContactValid(String displayName, String phoneNumber, int contactType){
            return new Contact(displayName, phoneNumber, contactType);
        }
    }
    
        //then
        Contact myGirlFriend = Contact.createContactValid("xxxx","000000",1);
        Contact unknowFriend = Contact.createContactUnknow("45454545");