java 静态工厂方法代码_java中静态工厂方法记录

转载请注明出处:https://www.cnblogs.com/rolayblog/p/10531374.html

什么是静态工厂方法

获取一个类实例最直接的方式就是使用new关键字,通过构造函数来创建对象,比如:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 Date date=newDate();2

3 Person person=new Person()

new关键字创建对象

或许你见过这种获取类实例的写法:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 Calendar calendar=Calendar.getInstance();2

3 Integer integer=Integer.valueOf("233");

静态工厂方法创建对象

上面这种就是我们的静态工厂方法,看源码可以看到里面的实现。下面说说静态工厂方法的优缺点。

优点1 它们可以有自己的名字

都知道在java里面,我们构造函数的名称和类名是一样的,这导致的一个问题是构造函数的名称不够灵活,经常不能准确地描述返回值,在有多个重载的构造函数时或者参数类型、数目又比较相似的话,那看起来就很打脑壳,头晕,比如下面这种写法:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 Integer integer1=Integer.valueOf("233");2 Integer integer2=Integer.valueOf(5);3 Integer integer3=Integer.valueOf("1",10);

构造方法创建对象

可以看到上面这种,多个重载函数,需要找到合适的函数调用。如果采用静态工厂方法起一个有意义的名字,就很清晰,例如:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 Integer integer1=Integer.valueOfByString("233");2 Integer integer2=Integer.valueOfByInt(5);3 Integer integer3=Integer.valueOfByStringAndRadix("1",10);

静态工厂方法

优点2 不用每次调用都创建新的对象

有时候外部调用者只需要拿到一个实例,而不关心是否是新的实例;又或者我们想对外提供一个单例时 —— 如果使用工厂方法,就可以很容易的在内部控制,防止创建不必要的对象,减少开销。

优点3 可以返回原返回类型的子类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 classPerson{2 publick staticPerson getInstance()3 {4 return newPerson();5 //获取返回 new Man(); new WoMan();

6 }7 }8 Class Man extendsPerson{9 }10 Class WoMan extendsPerson{11 }

返回原返回类型的子类

优点4 在创建带泛型的实例时,能使代码变得简洁

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 HashMap map=new HashMap();2 在java 7后已经优化为:3 HashMap map=new HashMap<>()4 这里只是举例说明

泛型实例

优点5 可以有多个参数相同,但名称不同的静态工厂方法

构造方法虽然可以有多个,但是需要参数类型不同,才能重载,比如:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 classPerson{2 int age = 10;3 int weight = 30;4 public Person(int age, intweight) {5 this.age =age;6 this.weight =weight;7 }8 public Person(intage) {9 this.age =age;10 }11 }

构造方法

此时,如果我要加一个Child( int weight)方法就会编译报错了。但是这时候如果我们用静态工厂方法就可以避免这种情况了:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 classPerson{2 int age = 10;3 int weight = 30;4 public static Person newPerson(int age, intweight) {5 Person person= newPerson();6 person.weight =weight;7 person.age =age;8 returnperson;9 }10 public static Person newPersonWithWeight(intweight) {11 Person person= newPerson ();12 person.weight =weight;13 returnperson;14 }15 public static Person newPersonWithAge(intage) {16 Person person= newPerson ();17 person.age =age;18 returnperson;19 }20 }

静态工厂方法

缺点1 类如果不含公有的或者受保护的的构造器,就不能被子类实例化。

缺点2 与其他静态方法没什么区别

总结

公有构造方法和静态工厂方法各有用处,但是就上面的优点来看,静态工厂方法更加适用。

ps:参考地址:https://www.jianshu.com/p/ceb5ec8f1174

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值