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

使用静态工厂方法代替构造器的几大优势:

  1. 静态工厂方法具有名称。 可以通过它的名称来判断它返回的实例的大概信息。
  2. 不必再每次调用时都创建一个新的实例。  例如单例类就使用了静态工厂方法。
  3. 静态工厂方法可以返回原返回类型的任何子类型的对象实例。   如返回类型是Service,可以返回Service类型的任何子类型
  4. 在创建参数化类型的实例时,静态工厂方法使代码变得更加简洁。

静态工厂方法的一些惯用名称:

  1. valueOf    该方法返回的实例与它的参数具有相同的值。它实际上时做类型转化的。
  2. of    valueOf的一种更为简洁的替代。
  3. getInstance   返回的实例通过方法参数来描述。对于单例类,该方法没有参数,并返回唯一的实例。
  4. newInstance     返回的实例通过方法参数来描述。每次返回的都是一个新的实例对象。
  5. getType      Type指明返回的实例的类型。
  6. newType     Type指明返回的实例的类型。

利用静态工厂方法实现的服务提供者框架模式  :

服务接口  :

1 public interface Service {
2      /**
3       * n种服务
4       */
5     //.....
6 }

服务提供者接口:

1 public interface Provider {
2      /**
3       * 可以提供的n种服务
4       */
5      Service  newService();
6 }

具有服务提供者注册API和服务访问API的  服务类:

 1 public class Services {
 2     //私有化构造器   通过静态工厂方法来得到想要的Service实例
 3     private Services(){}
 4     //用来保存服务提供者对象的Map对象
 5     private static  final Map<String, Provider> providerMap = new HashMap<String, Provider>();
 6     //服务提供者对象的默认 key值
 7     private static  final String DEFAULT_NAME = "<def>";
 8
 9     //提供静态工厂方法     将未提供key值得服务提供者对象 添加到Map对象中
10     public static void  registerProvider(Provider provider)
11     {
12         registerProvider(Services.DEFAULT_NAME, provider);
13     }
14
15     //提供静态工厂方法     将提供key值的服务提供者对象 添加到Map对象中
16     public static void  registerProvider(String name , Provider provider)
17     {
18         providerMap.put(name, provider);
19     }
20
21     //提供静态工厂方法   得到最终的服务对象
22     public static Service newInstance()
23     {
24         return newInstance(DEFAULT_NAME);
25     }
26     //提供静态工厂方法   得到最终的服务对象
27     public static  Service newInstance(String name)
28     {
29         Provider p = providerMap.get(name);
30
31         if(p == null)
32         {
33             throw new IllegalArgumentException("This provider not found");
34         }
35
36         return p.newService();
37     }
38 }
时间: 2024-08-08 04:02:27

第一条:考虑使用静态工厂方法代替构造器的相关文章

Efflective Java读书笔记 第一条 考虑用静态工厂方法代替构造器

创建一个类的实例的方法,最常用的是提供一个公有[public]的构造器,另外还有一种方法是类可以提供一个公有的静态工厂方法. 静态工厂方法对于构造器有着不同的优势和劣势. 优势: 1.静态工厂方法可定义更有意思的名称,而构造函数只能是类名. eg:BigInteger的构造函数返回的可能是素数,不过使用BigInteger.probablePrime更加明确. 2.静态工厂方法不必没有调用的时候都创建一个新的对象,这对于不可变类可以预先构造好实例,调用时静态工厂方法直接返回即可. eg:Bool

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

一:简述 让外部调用者获取类的一个实例(创建该类的对象),可以不提供一个公有的构造器,转而提供一个公有的静态工厂方法,该方法返回类的实例. 二:优点: 1.创建对象时,有名称,不再是通过重载构造方法从而实现不同的对象创建,更加清晰,比构造器命名方式更灵活. 2.再某些情况下,不需要每次new都出现一个新对象,如:Boolean.valueOf("true"),从来不创建对象.如果程序经常创建代价很高的相同对象,则可以考虑. 3.方法返回对象所属的类,在编写该静态方法所属的类时可以不存在

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

在effective java 中第一条提到用静态工厂方法代替构造器 优点如下: 1. 静态工厂方法有名字,构造器名字固定,不易于表达方法签名的意义 2. 不必在每次调用它们的时候都创建一个新对象 3. 可以返回类型的子类 好文地址 上面这篇文章讲的不错,作者的一系列文章都很不错,有时间可以好好研究下.其中第二条在原作者的评论中有很多人有疑问,在stackoverflow上有针对第二条的单独解释 参考信息 版权声明:本文为博主原创文章,未经博主允许不得转载.

Effective java读书札记第一条之 考虑用静态工厂方法代替构造器

对于类而言,为了让客户端获取它资深的一个实例,最常用的方法就是提供一个共有的构造器.还有一种放你发,也应该子每个程序员的工具箱中占有一席之地.类可以提供一个共有的静态 工厂方法,它只是返回类的实例的静态方法. 类可以通过静态工厂方法类提供它的客户端(对象),而不是通过构造器.提这样做的好处有: 1.静态工厂方法与构造器不同的第一大优势在于,它们有名称.比如构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果用名为BigInteger.probabl

Effective Java 读书笔记(一):使用静态工厂方法代替构造器

这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文<java中final与static的使用场景总结>. 什么是静态工厂方法? 可以参考书中的例子(摘自JDK1.7 java.lang.Boolean) public final class Boolean implements java.io.Serializable, Comparable<

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

NO1.考虑用静态工厂方法代替构造器 静态工厂方法与构造器不同的第一大优势在于它们有名称: 静态工厂方法与构造器不同的第二大优势在于,不必在每次调用它们的时候都创建一个新对象: 第三大优势,它们可以返回原返回类型的任何子类型的对象: 第四大优势,在创建参数化类型实例的时候,它们使代码变得更加简洁: 缺点: 1.类如果含公有的或者受保护的构造器,就不能被子类化. 2.它们与其他的静态方法实际不上没有任何区别.

【代码优化】考虑使用静态工厂方法取代构造器

静态工厂方法与设计模式中的工厂方法模式不同,和设计模式中的工厂方法模式不直接相应. 使用静态工厂方法比构造器的优势: 第一.静态工厂方法是有名称的,而构造器是通过參数推断的. 每一个静态工厂方法都有自己的名字,能够依据名称就能够推断它要做什么事情,而构造器是做不到的. 如:构造器BigInteger(int,int),返回BigInteger能够是素数,偶数等.而用名称BigInteger.probalePrime的静态工厂方法 就一目了然了,代码easy阅读. 第二.不必再每次调用时候都创建一

静态工厂方法VS构造器

我之前已经介绍过关于构建者模式(Builder Pattern)的一些内容,它是一种很有用的模式用于实例化包含几个属性(可选的)的类,带来的好处是更容易读.写及维护客户端代码.今天,我将继续介绍对象创建技术. 在我看来,下面这个类是非常有用的例子.有一个RandomIntGenerator 类,产生随机的int类型的整数.如下所示: public class RandomIntGenerator { private final int min; private final int max; pu

【代码优化】考虑使用静态工厂方法代替构造器

静态工厂方法与设计模式中的工厂方法模式不同,和设计模式中的工厂方法模式不直接对应. 使用静态工厂方法比构造器的优势: 第一.静态工厂方法是有名称的,而构造器是通过参数判断的. 每个静态工厂方法都有自己的名字,可以根据名称就可以判断它要做什么事情,而构造器是做不到的. 如:构造器BigInteger(int,int),返回BigInteger可以是素数,偶数等,而用名称BigInteger.probalePrime的静态工厂方法 就一目了然了,代码容易阅读. 第二.不必再每次调用时候都创建一个新的