时间:2021-05-20
Java静态工厂方法的实例详解
什么是静态工厂方法
对于类而言,为了让使用者获取它自身的一个实例,最常用的方法就是提供一个公有的构造器。
当然,这里要介绍的是另一种方法——静态工厂方法,一个返回类的实例的静态方法。
举个例子,Boolean的一个将基本类型boolean转为封装类的方法,valueOf:
为什么要使用静态工厂方法
那么,我们为什么要使用静态工厂方法,而不是使用构造器呢?
因为静态工厂方法,具有以下三个特点——具名、环保、多子,下面一个个来讲。
> 具名 静态工厂方法有名称
对于构造器来说,根据入参的不同可以有多个构造器,但是这些构造器的名称都是一样的,使用者在调用时就会一头雾水,到底应该调用哪一个呢。
而使用了静态工厂方法之后,你可以根据方法的功能给方法起不同的名字,只有名字起得好,使用者看到方法名就知道是什么意思,知道这时候应该调用哪一个方法,大大提高了代码的可读性。
> 环保 不必每次调用的时候都创建一个新对象
使用构造器,每次都会产生一个新的对象。
而静态工厂方法,可以重复地返回预先创建好的对象。
上面Boolean就是一个非常好的例子,TRUE和FALSE两个变量都是预先创建好的,而且都是不可变的final对象,谁需要用到了,就给它返回过去,也不用担心被修改了。
下面就是TRUE和FALSE两个变量的初始化代码:
> 多子 可以返回原返回类型的任何子类型的对象
使用构造器,你只能返回一种类型的对象;而使用静态工厂方法,你可以根据需要,返回原返回类型的任何子类型的对象。
以EnumSet的noneof方法为例:
这个方法,出于性能的考虑,具体返回什么类型,由枚举类型的数量决定,超过64,则返回JumboEnumSet,否则返回RegularEnumSet,而这两种类对于使用者来说是不可见的,使用者只需要知道他是EnumSet就好。
也正是因为静态工厂方法有着比构造器更大的优势,我们在创建类时,切忌第一反应就是提供公有构造器,要优先考虑静态工厂方法。
常见的静态工厂方法名
这里附上静态工厂方法的一些约定俗成的名称:
valueOf/Of——类型转换,返回的实例和入参具有相同的值,比如Boolean.valueOf()、EnumSet.valueOf()
getInstance——返回一个预先创建好的实例
newInstance——返回一个新的实例
静态工厂方法难道不就是工厂模式吗?
讲到这里,可能会有很多人觉得这不就是工厂模式吗?答:并不完全相同。
本文讲的静态工厂方法,和工厂模式一样,都是用来取代构造器的方法,都具有上面说的三个优势:具名、环保、多子。
但是,两者的实现方式和使用场景并不相同。
首先,直观上看,在代码结构上,我们说的工厂模式,通常需要一个xxxFactory类,在里面定义工厂方法;而本文讲的静态工厂
方法,则只需要一个类,类本身就提供了生产对象的工厂方法。
其次,我们想一下,假如一个类,在设计的时候,就提供了静态工厂方法,那么还需要使用工厂模式吗?
是的,不需要。
也就是说,只有当一个类没有提供静态工厂方法的时候,我们才需要使用工厂模式。
脑洞一下,假如苹果公司有强大的零部件工厂,那它还需要富士康吗?
总结
静态工厂方法具有三大优势——具名、环保、多子。
如果一个类提供了静态工厂方法,那么也就不需要考虑对这个类进行工厂模式了。
我们在创建类时,切忌第一反应就是提供公有构造器,要优先考虑静态工厂方法。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
Spring的实例工厂方法和静态工厂方法都可以用来实例化bean,本文我们就来看看相关实例。静态工厂方法:直接调用静态方法可以返回Bean的实例packagec
java工厂模式的实例详解工厂方法中的“工厂”和我们平常理解的一样:用于生产产品。而客户是要和产品打交道,所以工厂方法模式的意义在于把客户和产品分开,达到解耦和
同步容器在Java中,同步容器主要包括2类:Vector、Stack、HashTableCollections类中提供的静态工厂方法创建的类(由Collecti
本文实例讲述了Java设计模式之工厂方法模式。分享给大家供大家参考,具体如下:工厂方法模式使用的频率非常高,在我们日常的开发中总能遇见到它的身影。其定义为:De
1.简单工厂模式简介简单工厂模式(SimpleFactory),又被称为"静态工厂方法模式"。它属于"创建模式"(创建对象的模式),并且是"工厂方法"模式的一种