Java静态工厂方法的实例详解

什么是静态工厂方法
对于类而言,为了让使用者获取它自身的一个实例,最常用的方法就是提供一个公有的构造器。
当然,这里要介绍的是另一种方法——静态工厂方法,一个返回类的实例的静态方法。
举个例子,Boolean的一个将基本类型boolean转为封装类的方法,valueOf:
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
为什么要使用静态工厂方法
那么,我们为什么要使用静态工厂方法,而不是使用构造器呢?
因为静态工厂方法,具有以下三个特点——具名、环保、多子,下面一个个来讲。
> 具名 静态工厂方法有名称
对于构造器来说,根据入参的不同可以有多个构造器,但是这些构造器的名称都是一样的,使用者在调用时就会一头雾水,到底应该调用哪一个呢。
而使用了静态工厂方法之后,你可以根据方法的功能给方法起不同的名字,只有名字起得好,使用者看到方法名就知道是什么意思,知道这时候应该调用哪一个方法,大大提高了代码的可读性。
> 环保 不必每次调用的时候都创建一个新对象
使用构造器,每次都会产生一个新的对象。
而静态工厂方法,可以重复地返回预先创建好的对象。
上面Boolean就是一个非常好的例子,TRUE和FALSE两个变量都是预先创建好的,而且都是不可变的final对象,谁需要用到了,就给它返回过去,也不用担心被修改了。
下面就是TRUE和FALSE两个变量的初始化代码:
public final class Boolean implements java.io.Serializable,
Comparable<Boolean>
{
/**
* The {@code Boolean} object corresponding to the primitive
* value {@code true}.
*/
public static final Boolean TRUE = new Boolean(true);
/**
* The {@code Boolean} object corresponding to the primitive
* value {@code false}.
*/
public static final Boolean FALSE = new Boolean(false);
...
}
> 多子 可以返回原返回类型的任何子类型的对象
使用构造器,你只能返回一种类型的对象;而使用静态工厂方法,你可以根据需要,返回原返回类型的任何子类型的对象。
以EnumSet的noneof方法为例:
/**
* Creates an empty enum set with the specified element type.
*
* @param elementType the class object of the element type for this enum
* set
* @throws NullPointerException if <tt>elementType</tt> is null
*/
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
这个方法,出于性能的考虑,具体返回什么类型,由枚举类型的数量决定,超过64,则返回JumboEnumSet,否则返回RegularEnumSet,而这两种类对于使用者来说是不可见的,使用者只需要知道他是EnumSet就好。
也正是因为静态工厂方法有着比构造器更大的优势,我们在创建类时,切忌第一反应就是提供公有构造器,要优先考虑静态工厂方法。
常见的静态工厂方法名
这里附上静态工厂方法的一些约定俗成的名称:
valueOf/Of——类型转换,返回的实例和入参具有相同的值,比如Boolean.valueOf()、EnumSet.valueOf()
getInstance——返回一个预先创建好的实例
newInstance——返回一个新的实例
静态工厂方法难道不就是工厂模式吗?
讲到这里,可能会有很多人觉得这不就是工厂模式吗?答:并不完全相同。
本文讲的静态工厂方法,和工厂模式一样,都是用来取代构造器的方法,都具有上面说的三个优势:具名、环保、多子。
但是,两者的实现方式和使用场景并不相同。
首先,直观上看,在代码结构上,我们说的工厂模式,通常需要一个xxxFactory类,在里面定义工厂方法;而本文讲的静态工厂
方法,则只需要一个类,类本身就提供了生产对象的工厂方法。
其次,我们想一下,假如一个类,在设计的时候,就提供了静态工厂方法,那么还需要使用工厂模式吗?
是的,不需要。
也就是说,只有当一个类没有提供静态工厂方法的时候,我们才需要使用工厂模式。
脑洞一下,假如苹果公司有强大的零部件工厂,那它还需要富士康吗?
总结
静态工厂方法具有三大优势——具名、环保、多子。
如果一个类提供了静态工厂方法,那么也就不需要考虑对这个类进行工厂模式了。
我们在创建类时,切忌第一反应就是提供公有构造器,要优先考虑静态工厂方法。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Java静态工厂方法
# java
# 静态工厂
# 详解java
# 静态工厂方法
# java设计模式之工厂方法详解
# 工厂方法模式_动力节点Java学院整理
# java 工厂方法详解及实例代码
# java设计模式之工厂方法模式
# Java使用设计模式中的工厂方法模式实例解析
# Java设计模式编程之工厂方法模式的使用
# Java设计模式编程中的工厂方法模式和抽象工厂模式
# Java设计模式之工厂方法模式实例简析
# 详解Java从工厂方法模式到 IOC/DI思想
# 都是
# 多子
# 你可以
# 不需要
# 苹果公司
# 要使
# 的是
# 会有
# 是因为
# 他是
# 也就
# 多个
# 约定俗成
# 如有
# 就好
# 很多人
# 只需
# 更大
# 三大
# 希望能
相关文章:
国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?
网站专业制作公司有哪些,做一个公司网站要多少钱?
如何快速启动建站代理加盟业务?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
建站之星如何配置系统实现高效建站?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
,制作一个手机app网站要多少钱?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
高端建站三要素:定制模板、企业官网与响应式设计优化
开心动漫网站制作软件下载,十分开心动画为何停播?
广州商城建站系统开发成本与周期如何控制?
如何选择靠谱的建站公司加盟品牌?
营销式网站制作方案,销售哪个网站招聘效果最好?
如何规划企业建站流程的关键步骤?
制作网页的网站有哪些,电脑上怎么做网页?
建站之星24小时客服电话如何获取?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
建站之星如何实现PC+手机+微信网站五合一建站?
移民网站制作流程,怎么看加拿大移民官网?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
学校为何禁止电信移动建设网站?
网站制作软件有哪些,制图软件有哪些?
seo网站制作优化,网站SEO优化步骤有哪些?
建站主机与服务器功能差异如何区分?
义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?
linux top下的 minerd 木马清除方法
广州顶尖建站服务:企业官网建设与SEO优化一体化方案
上海网站制作开发公司,上海买房比较好的网站有哪些?
湖南网站制作公司,湖南上善若水科技有限公司做什么的?
如何在Golang中使用replace替换模块_指定本地或远程路径
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何快速搭建自助建站会员专属系统?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何在Ubuntu系统下快速搭建WordPress个人网站?
建站之星CMS五站合一模板配置与SEO优化指南
如何在阿里云服务器自主搭建网站?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
网站制作员失业,怎样查看自己网站的注册者?
家庭建站与云服务器建站,如何选择更优?
设计网站制作公司有哪些,制作网页教程?
香港服务器选型指南:免备案配置与高效建站方案解析
如何通过多用户协作模板快速搭建高效企业网站?
免费网站制作appp,免费制作app哪个平台好?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
网站制作壁纸教程视频,电脑壁纸网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。