EFFECTIVE JAVA 第一天 静态工厂方法

静态工厂方法:(这里指的是就是普通static方法),类可以通过静态工厂方法提供给它的客户端,而不是通过构造器。提供静态工厂方法而不是公有构造器,这样做有几大优势。
在类的实现中使用了API的类被称为该API的客户(client)
使用API编写程序的程序员称为该API的用户(user)
术语:基本类型:primitive,引用类型:reference type
    方法的签名:由名称和所有参数类型组成,不包括返回类型
优点:
1、 有名称(当一个类有多个相同签名的构造器,用静态工厂代替更容易理解)
    2、不必在每次调用的时候都new一个(单例模式、枚举对象比较可以直接用 == 而不是equal(可以提升性能)。如果是经常请求创建相同的对象,这可以大大提上性能)
    3、可以返回原返回类型的任何子类对象。(适用于基于接口的框架interface-based-framework,API可以返回对象,同时又不会使对象的类变成公有的(这句话还不理解),如JAVA Collections Framework)
    静态工厂返回对象所属的类,在编写客户端类时可以不必存在(只是定义了就可以,典型应用:服务提供者框架:如JDBC,最后是类似的一个例子。服务访问API可以利用Adapter模式提供更丰富的服务)
    4、在创建参数化类型实例的时候,代码更加简洁。
缺点 :
    1、类如果不含有public或protected的构造器就不能被子类实例化(如:collections framework(这里需要看) ,这样的好处是鼓励使用符合composition,而不是继承)
    2、与其他静态方法没有任何区别
    以下是静态工厂的管用名称:
1)    valueOf
2)    of---valueOf的一种简洁替代,如EnumSet中
3)    getInstance
4)    newInstance
5)    getType---Type表示工厂方法所返回的对象类型
6)    newType

package 服务提供者框架模式;
/**
 * @描述: 服务接口
 */
public interface Service {

}
/**
 * 服务提供者接口
 * 作用:负责创建服务实例(如果没有服务提供者接口,实现就按照类名称注册,并通过类反射进行实例化)
 * 对于JDBC,Connection是服务接口,DriverManager.registerDriver是提供者注册API
 * DriverManager.getConnection是服务访问API
 * Driver是服务提供者接口
 */
public interface Provider {
    //负责创建服务实例
    Service newService();
}
/**
 * @描述: 服务管理者
 */
public class ServiceManager {
    //prevents instantiation 防止实例化
    private ServiceManager() {}
    public static final String DEFAULT_PROVIDER_NAME = "<def>";
    public static ConcurrentHashMap<String, Provider> providers = new ConcurrentHashMap<String, Provider>();

    //provider registration API

    public static void resiterProvider(Provider p){
        resiterProvider(DEFAULT_PROVIDER_NAME,p);
    }
    public static void resiterProvider(String name,Provider p){
        providers.put(name, p);
    }

    //service access API(服务访问API可以利用Adapter模式提供更丰富的服务)
    public static Service newInstance(){
        return newInstance(DEFAULT_PROVIDER_NAME);
    }

    public static Service newInstance(String privoderName){
        Provider p = providers.get(privoderName);
        if(p == null)
            throw new IllegalArgumentException("没有注册的服务提供者!");
        return p.newService();
    }
}
时间: 2024-10-12 11:18:44

EFFECTIVE JAVA 第一天 静态工厂方法的相关文章

[Effective Java]考虑用静态工厂方法代替构造器

本文主要介绍如何使用静态工厂方法已经在那种场合来使用这种方式代替构造方法. 众所周知,对于类而言,我们为了获得一个类的实例对象,通常情况下会提供一个公有的(public) 的构造器.当然除了这种方法以外,我们还可以通过给类提供一个public的静态工厂方法(static factory method)的方式来完成,让它返回一个类的实例. 先看一个简单的Boolean的示例,这个示例将boolean基本类型值转换成一个Boolean对象的引用. public static Boolean valu

java的设计模式 - 静态工厂方法

静态工厂方法,也不知道为何叫这个名字.其实也就是一个静态函数,可以替代构造函数用.大名鼎鼎的 guava 就大量使用这种模式,这是非常有用的模式. 比如是 Integer i = Integer.valueOf(123); Boolean bool = Boolean.valueOf(true); //guava 的方法 ConcurrentMap<String,Integer> concurrentMap = Maps.newConcurrentMap(); ArrayList<Int

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

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

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

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

spring之通过静态工厂方法配置Bean

Car.java package com.gong.spring.beans.factory; public class Car { private String name; private double price; public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } p

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.它们与其他的静态方法实际不上没有任何区别.

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

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