资讯专栏INFORMATION COLUMN

静态工厂方法替代构造方法

浠ラ箍 / 3150人阅读

摘要:工厂方法模式工厂方法模式是一种设计模式,指的是让具体的工厂对象负责生产具体的产品对象。在我们使用构造函数创建对象的时候,我们每次时,都将创建一个新的对象,而如果我们通过静态工厂方法时,我们可以返回系统中已存在的对象。

目录:

普通构造方法与静态工厂方法

静态工厂方法与设计模式中的工厂方法区别

静态工厂方法的优势

静态工厂方法的缺点

普通构造方法与静态工厂方法

普通构造方法创建对象:
在Java中我们通常都是通过公有的构造方法来创建对象(即通过new+类名()的方式创建),例如:

通过静态工厂方法创建对象:
一般是指我们将对象中的某个方法的修饰符设置为static的,通过这个方法返回我们所需要的对象,例如:

在Boolean这个类中,我们通过valueOf()这个静态工厂方法返回内部已生成的对象(后文解释)。

静态工厂方法与设计模式中的工厂方法区别

静态工厂方法:静态工厂方法是通过调用类中某个静态方法从而得到该类或者其子类对象的一个方法,与我们常说的设计模式中的工厂方法不同。

工厂方法模式:工厂方法模式是一种设计模式,指的是让具体的工厂对象负责生产具体的产品对象。

主要区别:工厂方法模式里的静态工厂方法会创建各种不同的对象(不同类的实例),而静态工厂方法一般只创建属于该类的一个实例或者子类实例;

静态工厂方法的优势

知其名明其义:
假设我们要通过Number类获得一个某个区间的素数,代码如下:

通过这种方式,我们不难发现上面代码可读性差,如果我们不通过文档帮助,我们根本不知道Number(int min)和Number(int min,int max)这两个构造函数之间的区别,而如果我们通过静态工厂方式可以大大提高程序的可读性,做到知道该函数的名字,就能明白该函数所要完成的功能,代码如下:

调用静态工厂方法没必要每次都创建新的对象:

在开发过程中,当我们生成一个对象要浪费掉系统很多资源或者需要较长的时间来创建对象时,我们往往喜欢通过单例来解决系统的开销。在我们使用构造函数创建对象的时候,我们每次new时,都将创建一个新的对象,而如果我们通过静态工厂方法时,我们可以返回系统中已存在的对象。例如Boolean就是这样实现的:

当虚拟机加载Boolean类的时候,我们将生成两个常量TRUE和FALSE,如系统需要再次生成时,直接返回该常量,无需再次生成。

可以返回原返回类型的任何子类型的对象:
在普通构造方法中,我们生成的对象是该类的对象,而在静态工厂方法中,我们可以生成该类的子类对象,代码如下:

使代码更为简洁:
在我们调用参数话类的构造器时,即使类型参数很明显,我们也必须指出:

但是有了静态工厂方法,编译器就可以替我们找到类型参数:

静态工厂方法的缺点

类如果不包含公有的或者受保护的构造器,就不能被子类继承(继承也没用,因为在实例化子类时,要首先实例化父类)

与其它普通静态方法没有区别, 所以,一般一个静态工厂方法需要有详细的注释,遵守标准的命名,如使用getInstance、valueOf、newInstance等方法名

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/67947.html

相关文章

  • 第1项:考虑静态工厂方法而不是构造函数

    摘要:提供静态工厂方法而不是公共构造函数既有优点也有缺点。它们不像构造函数那样在文档中脱颖而出,因此很难弄清楚如何实例化提供静态工厂方法而不是构造函数的类。   类允许客户端获取实例的传统方法是提供公共构造器。还有一种技术应该是每个程序员的工具箱的一部分。一个类可以提供一个公共静态工厂方法,它仅仅是一个返回类实例的静态方法。下面是布尔(布尔型的盒装原语类)的一个简单示例。这个方法将一个布尔原...

    赵连江 评论0 收藏0
  • Java进阶1 —— 对象的创建与销毁

    摘要:构造方法是在对象实例初始化过程中具有举足轻重的地位,并且提供了多种方式来定义构造方法。在中创建对象的开销是相当低的,并且速度很快。对象终结器前面我们讲述的都是构造方法和对象初始化相关的主题,但还未提及他们的反面对象销毁。 原文链接:http://www.javacodegeeks.com/2015/09/how-to-create-and-destroy-objects.html 本文...

    nemo 评论0 收藏0
  • 第2项:当面临多个参数的构造器时考虑使用构建器

    摘要:因此,最好一开始就考虑使用构造器。与使用传统的重叠构造器模式相比,使用模式的客户端代码更易于阅读和编写,构建器也比更加安全。   静态工厂和构造器有个共同的局限性:他们都不能很好地扩展到大量的可选参数。考虑用一个类表示包装食品外面显示的营养成分标签。这些标签中有几个域是必需的:每份的含量、每罐的含量以及每份的卡路里,还有超过20个可选域:总脂肪、饱和脂肪量、转化脂肪、胆固醇、钠等等。大...

    KavenFan 评论0 收藏0
  • Java 高效编程(Effective Java)中文第三版

    摘要:来源前条来源一书英文版已经出版,这本书的第二版想必很多人都读过,号称四大名著之一,不过第二版年出版,到现在已经将近年的时间,但随着,,,甚至的发布,语言发生了深刻的变化。译者在这里第一时间翻译成中文版。供大家学习分享之用。 来源:sjsdfg/effective-java-3rd-chinese前 51 条来源:Effective Java, Third Edition 《Effec...

    ysl_unh 评论0 收藏0
  • 优秀代码的必知必会(一)?

    摘要:但由于模式本身有严重的缺陷,由于构造方法在多次调用中被分割,导致可能处于不一致的状态,并且还需要额外增加工作以确保线程安全。方法必须遵从类指定的常规约定,将不同的哈希码分配给不同的实例对象。 1.使用静态工厂方法替代构造方法 静态工厂方法的优点: 不像构造方法,它是有名字的。 它不需要每次调用时都创建一个新对象。 它可以返回 其返回类型的任何子类型的对象。 返回对象的类可以根...

    ChanceWong 评论0 收藏0

发表评论

0条评论

浠ラ箍

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<