目录
- 背景
- 情景一:不同参数数目的构造器
- 情景二:不同种类的汉堡
- 情景三:自定义汉堡的做法
- 什么是静态工厂方法
- 静态工厂优缺点
- 静态方法命名规范
- 小结
- 参考资料
背景
假如现在你要想一个汉堡,有一个汉堡类:Hamburg。那么一般情况下你会:
Hamburg hamburg = new Hamburg();
情景一:不同参数数目的构造器
制作汉堡可以选择自定义,加肉,加菜,或者不添加,直接默认配方即可,那么会有以下几个构造器:
Hamburg();
Hamburg(Meat meat);
Hamburg(Meat meat,Vegetable vegetable);
当你要制作汉堡的时候,看到这么多的构造器,但是却不知道他们是什么意思,返回的汉堡到底有什么区别?查文档又有点麻烦,有没有更好的解决方法呢?
情景二:不同种类的汉堡
如果有多种汉堡:新奥尔良汉堡,麦辣香汉堡。常规的做法就是:继承汉堡类,实现子类,如:
class xinaoerliangHamburg extends Hamburg{}
class mailaHamburg extends Hamburg{}
但是会有问题:用户在使用的时候,还得记住你那么多类名,那是不是很麻烦?如果后续有更多的口味,那是不是要记住更多地类去才能得到对应的实例呢?有没有更好的解决方法?
情景三:自定义汉堡的做法
如果汉堡的手法让你非常不满意,你想要用达芬奇技法来制作汉堡,那么可以怎么做呢?常规的做法是:
class Hamburg{
...
//默认制作手法
private Maker mMaker = new DefaultMaker();
public Hamburg(Maker maker){
...
//使用传进来的手法对象制作汉堡
mMaker = maker;
...
}
}
需要重新写一个构造器,传入参数来覆盖原来的制作手法。这样既有情景一的问题,还有另外的问题是:如果需要自定义的东西多的时候,那么Hamburg里需要维护的代码就更加的复杂了。
什么是静态工厂方法
以上情景问题可以通过静态工厂方法来改善。
注意,这里的静态工厂方法并不是设计模式中的工厂模式。这里只是使用静态工厂方法来代替构造器实例化对象。
顾名思义,静态工厂方法,就是使用静态方法来构建类的实例,解决使用构造器实例化的各种问题。先看个例子,还是以上面的汉堡为例子,如果需要多种口味的汉堡,那么可以:
class Hamburg{
//获取奥尔良口味的汉堡
public static Hamburg ofAoErLiang(){
return new AoErLiangHamburg();
}
//获取麦辣香味的汉堡
public static Hamburg ofMaiLaXiang(){
return new MaiLaXiangHamburg();
}
}
//两种口味的汉堡,通过继承汉堡实现
class AoErLiangHamburg extends Hamburg{}
class MaiLaXiangHamburg extends Hamburg{}
通过这种方法可以解决的是:用户需要什么类型的汉堡,可以直接通过Hamburg的静态方法来获取,而无需知道他的子类名字是什么。而如果有更多种口味的汉堡,只需要扩展静态方法即可;或者给静态方法增加参数,通过switch来返回对应的口味汉堡。
静态工厂优缺点
这里的话会结合上面举的例子,如果忘记了,看到可以返回去看一下。
优点
- 解决构造器重载却不知道各种构造器含义的问题。通过构造方法可以在方法名写明,那么用户只需要通过方法名就知道这个方法是返回什么对象。(例如情景一)例如:
//不同的静态工厂方法返回不同的实例,通过方法名就知道他们的区别
//ps:这是android的动画类
ObjectAnimator animator = ObjectAnimator.ofFloat();
ObjectAnimator animator = ObjectAnimator.ofInt();
- 可以通过根据用户的参数或者调用不同的静态工厂方法来返回具体的子类对象。当后期要更换方法接口返回的子类时,对于用户来说也是透明的,用户只是拿到一个父类引用的对象。可以参考上面我在介绍静态工厂方法举的例子。
Java 8以上,可以在接口中定义静态工厂方法,这样无需知道该接口有多少个实现类,只需要根据静态方法来获取接口对象即可。
- 重复利用对象,防止创建无用实例。这看起来很像单例,但是比单例要灵活得多。可以根据具体的情况,来判断是否要缓存实例。
- 可以动态注册代码。我们可以通过一组用户注册api,让用户先把需要的自定义代码注入,再调用静态方法来获取自己需要的对象类型。这样的好处就是不会有一堆很复杂的构造器,内部逻辑也可以分离。对应情景三解决的问题
缺点
- 如果该类不包含public或者protect构造器,那么将无法被子类实例化。因为我们想要用户通过静态方法来获取对象,而不喜欢用户通过构造方法来实例化对象。而如果把构造器设置为private,则无法被子类继承。
- 无法在javadoc中直接查看文档介绍,构造器是会直接生成doc的。但是直接通过方法名和参数名,已经可以看懂很多了。
静态方法命名规范
| 方法名 |
含义 |
| fromXxx |
类型转换 |
| ofXxx |
多个参数聚合 |
| valueOf |
和from of类似 |
| getInstance |
获取一个实例,实例类型通过方法参数描述 |
| getNewInstance/create |
获取一个新的实例 |
| getType |
主要用于工厂方法中获取不同类的对象(属于设计模式中的工厂方法) |
| newType |
新建一个对应类的对象(属于设计模式中的工厂方法) |
| type |
上面两者的简化版 |
小结
在有多种子类或者重载构造器的时候,可以优先考虑一下静态工厂方法,可以让我们的代码更加地优雅,也方便我们进行维护。
另外这和设计模式中的工厂模式有区别,并不是一样的,要进行区分。
参考资料
《effective java》
以上就是java 静态工厂代替多参构造器的详细内容,更多关于java 静态工厂的资料请关注其它相关文章!
相关推荐:
什么是seo推广找行者SEO,seo推广效果怎么样 ,西宁ai万词霸屏系统
WPQQ-开启数字时代的智能连接新纪元,杭州网站推广厂家电话
在线AI写文:开启高效创作新时代
SEO全站优化:打造强大网站排名的必备利器,AI论文写作的优点
seo要会些什么,seo需要学些什么内容 ,轻盈ai
在线AI文章生成器开启智能创作新时代
怎么识别是AI写的文章
AI提炼主要内容:如何让信息更精准、高效、易懂,女军人ai
AI工具汇总网站,让科技为您的工作加速
seo要学什么语言,做seo需要什么语言 ,ai martino
SEO薪资这些,你也能月入过万!,天水网站建设公司
好用的AI写作软件,让创作更高效
什么是seo手段,seo的具体手段 ,中国ai 企业
SEO功能:助力网站流量提升与品牌曝光,天津公司网站建设与维护
SEO定价策略:如何根据企业需求定制最佳价格方案,教育培训抖音营销推广
SEO是什么意思?揭秘SEO的真正含义与重要性,公司推广网站询问d火18星来
ChatGPT:我目前无法查看或解析附件,您是否遇到过这样的困扰?,ai+燃烧
亚马逊产品seo什么意思,亚马逊平台产品专业术语 ,小新同学ai
ChatGPT美区要梯子吗?轻松畅享全球智能聊天体验,ai音位
seo稿件是什么意思,seo文章写作要求 ,ai写作未来展望和展望
SEO工装裤-打造时尚与实用兼备的工作利器,ai画中国爸爸辅导孩子写作业
ChatGPT-4中文免费破解版:无需付费,体验最强AI助手,ai写作生成器官方下载
为什么新手做seo好做,为什么要懂seo ,ai少女 3060显卡
Bing学术搜索结果不显示时间?如何解决这一问题,提升学术研究效率!,ai怎么参考线
ChatGPT登录界面都不显示了?可能是这些原因导致的!,上海小学ai智能课
SEO运营工作是什么,seo公司运营 ,720516AI
ChatGPT打不开实时问题解决方案:让你的AI助手始终在线,psd 转ai
SEO做法-提升网站流量与排名的关键秘诀,屏东网站推广招聘
未来写作新模式文章撰写AI如何助力内容创作
seo资源是什么意思,seo资源怎么打开 ,梅州ai自动插件加工
SEO赚钱:如何通过SEO技能在网络上实现财富自由,网站怎么建设推广平台
为什么做seo的人很少,为了什么做seo ,ai不负你
ChatGPT最新版本更新内容:智能对话体验再升级,更多功能与应用,ai证伪
ChatGPT为什么用不了了?背后的真相揭秘!,ai写作专家收费吗
未来智能:AI智能人工软件引领数字化变革
URL站长的崛起:打造高效网站运营的秘密武器,网站建设费用计算依据
seo网络培训是什么,seo工作培训会培训啥 ,ai长投影字
SEO优化公司一般怎么优化?揭秘专业SEO服务的操作流程,人工智能ai写作软件 哪一个好
SEO子-为你的网站注入流量的秘密武器,麻城网站网址优化
seo网站需要做什么,seo都需要做什么 ,ai怎么做喷漆效果
SEO关键词的选择步骤:让你的网站在搜索引擎中脱颖而出,ai书法化
SEO师:如何在数字时代为企业赢得流量与销量,十堰网站关键词优化教程
seo规范是什么意思,seo包括哪些内容 ,AI智能破解
Chato1免费么?揭开这款AI聊天机器人的神秘面纱,交个朋友ai写作
AI智能工具的无限可能:未来已来,你准备好了吗?
专业SEO方案助力企业网站流量暴增,精准引流不再是难题,网站建设合同4篇
seo运营经理是什么,seo和运营的区别 ,皖妍ai宁慕晴o
优化收费,助力企业提升效益,实现共赢,宜州餐饮网站建设
ChatGPT安装包Windows版:让AI助力你的工作与生活,人工智能ai不是梦在线
SEO重要性与企业互联网发展的必由之路,互联网营销推广平台设计