用静态工厂方法替代构造器 《Effective Java》读书笔记

原创 2018年04月16日 20:30:32

什么是静态工厂方法?

通过
1.className.getInstance();
2.className.newInstance();
3.className.valueOf();
等静态方法获得对象实例。
而一般我们会直接采用
new className(param1,param2)即构造器的方法来得到实例

静态工厂方法相比于构造器的优势

1.静态方法有名称

构造器并没有确切描述返回的对象,而适当名称的静态工厂方法可以有更佳的可读性。

2.静态工厂方法可以采用单例模式等限制对象数量

静态方法返回的对象可以是 new className(),也可以是已经有的对象。

3.静态工厂方法可以返回类型的任何子类型

样例代码

public interface Service{
\\some function
}
public interface Provider{
    Service newService();
}
public class Services{
    private Services(){};
    private static final Map<String,Provider> providers = new ConcurrentHashMap<String,Provider>();
    //provider register API
    public static void registerDefaultProvider(Provider p){
        registerProvider(DEFAULT_PROVIDER_NAME,p);
    }
    public static void registerProvider(String name,Provider p){
        providers.put(name,p);
    }

    //Service access API
    public static Service newInstance(){
        return newInstance(DEFAULT_PROVIDER_NAME);
    }
    public static Service newInstance(String name){
        Provider p = provider.get(name);
        if(p==null){
            throw new IllegalArgumentException(
                "No Provider registered with name:"+name);
        return p.newService();
    }

}

4.在创建参数化实例的时候,代码更简洁

代码:

Map<String,Integer> map = new HashMap<String,Integer>();
//对比
public static <K,V> HashMap<K,V> newInstance(){
    return new HashMap<K,V>();
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq951127336/article/details/79965996

C++批判系列5--继承的本质

继承的本质继承关系是一种耦合度很高的关系,它与组合及一般化(genericity)一样,提供了OO中的一种基本方法,用以将不同的软件组件组合起来。一个类的实例同时也是那个类的所有的祖先的实例。为了保证...
  • cber
  • cber
  • 2001-06-09 15:59:00
  • 1484

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

考虑用静态工厂方法替代构造器  对于类而言,为了让客户端获得它自身的一个实例,最常用的方法就是提供一个 公有 的构造器,除了这种方式外,另外一种实现方式 是为类提供一个公有的的静态工厂方法静态工厂方法...
  • zhuoxiuwu
  • zhuoxiuwu
  • 2016-03-06 11:35:30
  • 763

1、考虑用静态工厂方法代替构造器(effective java)

考虑静态构造方法这里的静态构造方法不等于设计模式中的工厂模式public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE...
  • guanhang89
  • guanhang89
  • 2016-06-07 14:35:47
  • 847

Java中用静态工厂方法代替构造器的优缺点

Effective Java学习几笔,静态工厂方法的善用。 一般情况下,对于类而言,我们获取一个类的实例时,最常用的方法是提供一个公有的构造器。 但是还有一种方法,类可以提供一个公有的静态工厂方法,...
  • moyu123456789
  • moyu123456789
  • 2016-09-04 00:31:45
  • 2575

【effective java】考虑用静态工厂方法替代构造器

这里所说的静态工厂方法就是返回类型实例的静态方法。 那么为什么不使用构造器呢?用构造器方式构造实例不是我们一直约定好的吗? 嘿嘿 主要原因还是我们的构造器方法规定的太多限制了我们程序的灵活性: ...
  • zhang991688210
  • zhang991688210
  • 2015-06-21 20:16:05
  • 209

静态工厂方法代替构造器的总结

一、静态工厂方法与构造器不同的第一大优势在于,它们有名称。 1.方法的签名 (1)定义:方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。 (2)注意:不包括它的返回类型以及访问修饰符...
  • tscyds
  • tscyds
  • 2016-04-12 23:44:12
  • 596

effective java笔记(一) —— 构造器实现之builder模式

当一个类中有大量的构造参数时,静态方法和构造器已经不能满足对象的实例化,那么我们将考虑构建器。 构建器模式:1、重叠构造器模式             2、javaBeans模式(自己常用的一...
  • AlanYangYi
  • AlanYangYi
  • 2015-07-01 22:54:41
  • 1357

2、遇到多个构造参数的时候需要考虑使用构建器(effective java)

考虑多个构造参数什么意思,一个类的构造参数很多,但是你不是每次构造都用上所有的单数...
  • guanhang89
  • guanhang89
  • 2016-06-07 21:04:37
  • 365

《effective java》读书笔记——(一)

《effective java》这本书,买了有半年之久了,我也大概翻阅了一遍,说实话,没看懂,觉得这本书简直烂透了,看得我云里雾里的。后来,这本书被我束之高阁了,偶然在一篇博客上看到,至少要把《eff...
  • liujulie
  • liujulie
  • 2016-04-10 20:45:56
  • 263

Effective Java 读书笔记——41:慎用重载

先看一个使用重载错误的例子: public class CollectionClassifier { public static String classify(Set s) { ...
  • a921122
  • a921122
  • 2017-02-02 11:27:02
  • 433
收藏助手
不良信息举报
您举报文章:用静态工厂方法替代构造器 《Effective Java》读书笔记
举报原因:
原因补充:

(最多只允许输入30个字)