• java中静态工厂方法记录


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

    什么是静态工厂方法

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

    1 Date date=new Date();
    2 
    3 Person person=new Person()
    new关键字创建对象

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

    1 Calendar calendar=Calendar.getInstance();
    2 
    3 Integer integer=Integer.valueOf("233");
    静态工厂方法创建对象

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

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

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

    1 Integer integer1=Integer.valueOf("233");
    2 Integer integer2=Integer.valueOf(5);
    3 Integer integer3=Integer.valueOf("1",10);
    构造方法创建对象

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

    1 Integer integer1=Integer.valueOfByString("233");
    2 Integer integer2=Integer.valueOfByInt(5);
    3 Integer integer3=Integer.valueOfByStringAndRadix("1",10);
    静态工厂方法

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

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

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

     1 class Person{
     2     publick static Person getInstance()
     3     {
     4         return new Person();
     5         //获取返回 new Man(); new WoMan();
     6      }
     7 }
     8 Class Man extends Person{
     9 }
    10 Class WoMan extends Person{
    11 }
    返回原返回类型的子类

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

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

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

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

     1   class Person{
     2    int age = 10;
     3      int weight = 30;
     4      public Person(int age, int weight) {
     5          this.age = age;
     6          this.weight = weight;
     7      }
     8      public Person(int age) {
     9          this.age = age;
    10      }
    11  }
    构造方法

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

     1 class Person{
     2     int age = 10;
     3     int weight = 30;
     4     public static Person newPerson(int age, int weight) {
     5         Person person= new Person();
     6         person.weight = weight;
     7         person.age = age;
     8         return person;
     9     }
    10     public static Person newPersonWithWeight(int weight) {
    11         Person person= new Person ();
    12         person.weight = weight;
    13         return person;
    14     }
    15     public static Person newPersonWithAge(int age) {
    16        Person person= new Person ();
    17         person.age = age;
    18         return person;
    19     }
    20 }
    静态工厂方法

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

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

    总结

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

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

    甘于平凡,做一个甘于平凡的人,菜米油盐,生老病死。
  • 相关阅读:
    与我十年长跑的女朋友就要嫁人了
    与我十年长跑的女朋友就要嫁人了
    面试技巧
    面试技巧
    [转载]axis2通过wsdl生成客户端程序并本地调用
    [转载]axis2通过wsdl生成客户端程序并本地调用
    generator自动生成mybatis配置和类信息
    generator自动生成mybatis配置和类信息
    [转载]整合struts2、Spring3实现web快速开发
    [转载]整合struts2、Spring3实现web快速开发
  • 原文地址:https://www.cnblogs.com/rolayblog/p/10531374.html
Copyright © 2020-2023  润新知