时间:2021-05-19
假如现在你要想一个汉堡,有一个汉堡类: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来返回对应的口味汉堡。
这里的话会结合上面举的例子,如果忘记了,看到可以返回去看一下。
Java 8以上,可以在接口中定义静态工厂方法,这样无需知道该接口有多少个实现类,只需要根据静态方法来获取接口对象即可。
在有多种子类或者重载构造器的时候,可以优先考虑一下静态工厂方法,可以让我们的代码更加地优雅,也方便我们进行维护。
另外这和设计模式中的工厂模式有区别,并不是一样的,要进行区分。
《effective java》
以上就是java 静态工厂代替多参构造器的详细内容,更多关于java 静态工厂的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
1.构造器也就是在上一篇讲的那个例子,调用默认的无参构造函数2.静态工厂方法1)创建需要执行的方法的类publicclassHelloWorld{publicH
1.有三种实例化方式(无参构造,静态工厂,实例工厂),最常用的还是无参构造的方式2.bean标签中常用的属性id/name:唯一标识名称,两者作用一样,只是na
Java静态工厂方法的实例详解什么是静态工厂方法对于类而言,为了让使用者获取它自身的一个实例,最常用的方法就是提供一个公有的构造器。当然,这里要介绍的是另一种方
本文实例讲述了Java构造代码块,静态代码块原理与用法。分享给大家供大家参考,具体如下:本文内容:局部代码块构造代码块静态代码块补充首发日期:2018-03-2
规则1(无继承情况下):对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器证明代码