Java对象学习之创建对象——使用静态工厂方法代替构造器缺点

最近学习Android知识,发现Java好多的基础知识运用的真的很一般,所以决定在重新梳理一下,现在Kotlin也来了,在Android之路上,留给我看Java的时间不多了。

      静态我们就来简单介绍一下,使用静态工厂方法创建对象相较于构造器创建的对象的优缺点。主要概括如下:

优点:

  • 静态工厂方法有名称,可以明确的创建对应功能和属性的Java对象
  • 静态工厂方法可以预构建Java对象,实现在必要的情况下创建尽量少的对象实例
  • 静态工厂方法可以获取预构建Java对象的任何子类对象
  • 静态工厂方法在构建参数化实例的时候,代码更简洁

缺点:

  • Java类如果没有公有的或者受保护的构建器,就不能被子类化
  • 静态工厂方法和一般静态方法没有任何区别

静态工厂方法与构造器创建Java对象的对比已经介绍完了,静态就来介绍一下使用静态工厂方法创建对象的缺点,以及我们常常使用的一些静态工厂方法的名称。

1,静态工厂方法创建对象缺点

1.1 类如果不含有公共的或者受保护的构造器,就不能被子类化

这句话与我们上面总结介绍的优点三是相悖的。其实就是这一句话

1.2  它们在形式上和普通的静态方法没有任何区别

这样就面临一个问题,如果一个类提供了静态方法构建该类的实例对象但是没有API的话,我们很难找到究竟该如何实例化一个该类的对象。

2,常见的用于构建对象的静态工厂方法名称

(1)valueOf()

这个大家一定不陌生,因为我们平时用的实在是太多了。最常见的就是几个基本类型封装起来的类,比如Integer,Float等:

static Integer valueOf(int i)
          返回一个表示指定的 int 值的 Integer 实例。
static Integer valueOf(String s)
          返回保存指定的 String 的值的 Integer 对象。
static Integer valueOf(String s, int radix)
          返回一个 Integer 对象,该对象中保存了用第二个参数提供的基数进行解析时从指定的 String 中提取的值。
static Float valueOf(float f)
          返回表示指定的 float 值的 Float 实例。
static Float valueOf(String s)
          返回保存用参数字符串 s 表示的 float 值的 Float 对象。

(2)of(),一种valueOf()简写

比如EnumSet:

static
<E extends Enum<E>>
EnumSet<E>
of(E e)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E first, E... rest)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e1, E e2)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e1, E e2, E e3)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e1, E e2, E e3, E e4)
          创建一个最初包含指定元素的枚举 set。
static
<E extends Enum<E>>
EnumSet<E>
of(E e1, E e2, E e3, E e4, E e5)
          创建一个最初包含指定元素的枚举 set。

(3)getInstance(),返回的对象通过方法的参数来描述,对于Singleton来说,就没有参数

(4)newInstance(),和上面一样,但是它的特点是可以保证每次返回的对象都不同

(5)getType(),和(3)一样,通常在工厂方法不在本类中的时候使用,Type表示工厂方法锁返回的对象类型

(6)newType(),和(4)一样,通常在工厂方法不在本类中的时候使用,Type表示工厂方法锁返回的对象类型

其中(5)和(6)可以会看我在优点一举的例子,就是通过这样的方式获取的实例。对于(3)和(4)我这里也可以很快的举一个例子,可以参考一下。

package hfut.com.why;

 public class ConstantStringFactory {

     private String description;
     private int id;

     private static ConstantStringFactory cstr = new ConstantStringFactory("this is a constant string");

     public ConstantStringFactory() {

     }

     public ConstantStringFactory(String str) {
         // TODO Auto-generated constructor stub
         this.description = str;
     }

     public ConstantStringFactory(String str, int id) {
         // TODO Auto-generated constructor stub
         this.description = str;
         this.id = id;
     }

     // 获取实例--单例模式Singleton,当构造器权威私有的时候
     public static ConstantStringFactory getInstance() {
         return cstr;
     }

     // 依据参数获取实例1
     public static ConstantStringFactory getInstance(String str) {
         return new ConstantStringFactory(str);
     }

     // 依据参数获取实例2
     public static ConstantStringFactory getInstance(String str, int id) {
         return new ConstantStringFactory(str, id);
     }

     // 每次创建不同的实例对象
     public static ConstantStringFactory newInstance() {
         return new ConstantStringFactory();
     }

     @Override
     public String toString() {
         // TODO Auto-generated method stub
         return description;
     }

     @Override
     public boolean equals(Object arg0) {
         // TODO Auto-generated method stub
         return this.toString().equals(arg0.toString());
     }

 }

猜你喜欢

转载自blog.csdn.net/hfut_why/article/details/82730094
今日推荐