美文网首页
第一条 考虑用静态工厂方法代替构造器

第一条 考虑用静态工厂方法代替构造器

作者: 没走过的二丁目 | 来源:发表于2018-01-17 15:45 被阅读0次

创建和销毁对象

考虑用静态工厂方法代替构造器

  • 一般使用构造器
public class Person {
    private String name;
    public Person(String name){
        this.name = name;
    }
}
  • 使用静态方法
public class Person {
    private String name;
    private  Person(String name){
        this.name = name;
    }
    public static Person newInstance(String name){//静态工厂方法
        return new Person(name);
    }
}

这样写的优势

  • 静态方法有名字
    构造器与类名相同,如果构造器的参数本身没有确切的描述正被返回的对象,那么具有适当名字的静态工厂更容易使用,产生的客户端代码也更易于阅读。
  • 不必在每次调用的时候都创建一个新对象
    1.这使得不可变类,可以使用预先构建好的实例,或者将构建好的实例缓存,重复利用
    2.静态工厂方法能够为重复的调用返回相同对象,这样有助于类总能严格控制在某几个时刻哪些实例应该存在--实例受控类
    实例受控类可以确保他是一个singleton或者是不可实例化的
public class Person {
    private  static Person mPerson;
    private String name;
    private  Person(String name){
        this.name = name;
    }
    public static Person newInstance(String name) {//静态工厂方法
        if (mPerson != null) {
            mPerson = new Person(name);
        }
        return mPerson;
    }
}
  • 它可以返回原返回类型的任何子类型的对象
public class Person {
    public static Person newInstance(String name) {
        return Child.newInstance()
    }
}
class Child extends Person{
    public static Child newInstance{
        return new Child();
    }
}

通过代码很容理解这条原则,那么,这样写的好处是什么?
答:隐藏接口的实现类,使得接口的编写和调用更加简洁,API可以返回对象,又不会使得对象的类变成公有
代码举例

public interface Service {
          void method();
}

通过一个Service类提供各种接口的实现:

public class Services {
          private static final MyService myService = new MyService();
          private static final AnotherService anotherService = new AnotherService();
          private Services(){}

          public static Service getMyService() {//构造器
              return myService;
          }
          public static Service getAnotherService(){//构造器
              return anotherService;
          }

          private static class MyService implements Service{
              @Override
              public void method() {
                  //do some things...
              }
          }
          private static class AnotherService implements Service{
              @Override
              public void method() {
                  //do some things...
              }
          }
}

调用

Service mySevice = Services.getMyService();
Service anotherService = Services.getAnotherService();

缺点

  • 类没有公有的或者受保护的构造器,不能被子类化。
  • 想要查明如何实例化的一个类,非常困难

简而言之,静态工厂方法和公有构造器都各有用处,我们需要理解它们各自的长处。静态工厂通常更加适合,因此切忌第一反应就提供公有构造器,而不优先考虑静态工厂。

相关文章

  • 创建和销毁对象

    第一条:考虑用静态工厂方法代替构造器。 第二条:遇到多个构造器参数时要考虑用构造器。 第三条:用私有构造器或者枚举...

  • 创建和销毁对象

    1,考虑用静态工厂方法代替构造器 切忌第一反应就是提供共有构造器,而不先考虑静态工厂。 类可以通过静态工厂方法返回...

  • Effective Java第二章读书笔记

    第一条:考虑静态工厂方法代替构造器 静态工厂方法的优势: 有名称(例子中的probablePrime) 不必每次调...

  • effective java读书笔记

    一、考虑用静态工厂方法代替构造器1.静态工厂方法有名称,而构造器只能是类名 private Map > map =...

  • effective java学习笔记 原则1:考虑用静态工厂方法

    原则1:考虑用静态工厂方法代替公有构造器 提供实例的方式:静态工厂方法(非设计模式中的静态工厂模式)公有构造器ne...

  • Java创建和销毁对象

    考虑用静态工厂方法代替构造器 静态工厂方法可以通过静态获取类的一个实例,而不需要通过构造器; 使用静态工厂方法的优...

  • java编程建议系列一

    1.考虑用静态工厂方法代替构造器 静态工厂方法惯用名称 valueOf —— 类型转换方法 of —— value...

  • 第一条 考虑用静态工厂方法代替构造器

    创建和销毁对象 考虑用静态工厂方法代替构造器 一般使用构造器 使用静态方法 这样写的优势 静态方法有名字构造器与类...

  • Effective Java--(1)创建和销毁对象

    1 考虑用静态工厂方法代替构造器 例如如下方法: 静态工厂方法和构造器都各有长处,我们需要理解各自长处,做出合适的...

  • 第二章、创建和销毁对象

    第一条:考虑静态工厂方法代替构造器 静态工厂方法与构造器相比的优势: 有名称;不必再每次调用他们的时候都创建一个新...

网友评论

      本文标题:第一条 考虑用静态工厂方法代替构造器

      本文链接:https://www.haomeiwen.com/subject/jcnwnxtx.html