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();
}
}
EFFECTIVE JAVA 第一天 静态工厂方法的更多相关文章
- java的设计模式 - 静态工厂方法
静态工厂方法,也不知道为何叫这个名字.其实也就是一个静态函数,可以替代构造函数用.大名鼎鼎的 guava 就大量使用这种模式,这是非常有用的模式. 比如是 Integer i = Integer.va ...
- 高效JAVA之用静态工厂方法代替构造器
程序员这行干的久了,总会染上一些恶习,我就染上一个让人深恶痛绝,自己却津津乐道的习惯,还不想改的那种,它可以叫做强迫症,也可以叫做洁癖.那就是我不允许我的IDEA出现一点点警告,什么黄色背景,绿色波浪 ...
- effective解读-第一条 静态工厂创建对象代替构造器
好处 有名称,能见名知意.例如BigInteger的probablePrime方法 享元模式.单例模式中使用 享元模式:创建对象代价很高,重复调用已有对象,例如数据库连接等.享元模式是单例模式的一个拓 ...
- Java 的静态工厂方法
本文转载自:https://www.jianshu.com/p/ceb5ec8f1174 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器不同的第一优势在于,它们有名 ...
- Java - 用静态工厂方法代替构造器
Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...
- 比较 Java 静态工厂方法与构造函数
1 什么是静态工厂方法 Java 静态工厂方法是在方法前加上 public static,让这个方法变为公开.静态的方法.该方法返回该类的一个实例,就好像一个工厂生产出一个产品.所以称之为静态工厂方法 ...
- 静态工厂方法和实例工厂方法及普通的bean
容纳你的bean bean工厂:最简单的容器,提供了基础的依赖注入支持.创建各种类型的Bean. 应用上下文(ApplicationContext):建立在bean工厂基础之上,提供系统架构服务. ...
- Spring学习--静态工厂方法、实例工厂方法创建 Bean
通过调用静态工厂方法创建 bean: 调用静态工厂方法创建 bean 是将对象创建的过程封装到静态方法中 , 当客户端需要对象时 , 只需要简单地调用静态方法 , 而不需要关心创建对象的细节. 要声明 ...
- Effective java读书札记第一条之 考虑用静态工厂方法取代构造器
对于类而言,为了让client获取它自身的一个实例,最经常使用的方法就是提供一个共同拥有的构造器. 另一种放你发,也应该子每一个程序猿的工具箱中占有一席之地.类能够提供一个共同拥有的静态 工厂方法.它 ...
随机推荐
- css3实现图片划过一束光闪过效果
该效果在京东里的图片有. .img { display:block; position: relative; width:800px; height:450px; margin:0 auto; } . ...
- 【linux高级程序设计】(第十五章)UDP网络编程应用 2
UDP广播通信 单播:一对一,TCP和UDP均可完成 广播:只能UDP完成.广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口.路由器默认不转发任何广播数据包.故广播在局域网 ...
- J.U.C并发框架源码阅读(六)ConditionObject
基于版本jdk1.7.0_80 java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject 代码如下 /** * Con ...
- PostgreSQL备份和恢复数据表
备份数据表: pg_dump -U user_name db_name -t table_name -f /tmp/backup_file.suffix 恢复数据表: 方法1: 登录数据库:\i /t ...
- 线段树【SP1043】GSS1 - Can you answer these queries I
Description 给出了序列\(A_1,A_2,-,A_n\). \(a_i \leq 15007,1 \leq n \leq 50000\).查询定义如下: 查询\((x,y)=max{a_i ...
- Email List
题目:给几个Email的list,输出全部list的交集(在全部list中都出现过的email). 思路:用set记录前i个list中都含有的email,当进行第i+1时,检查每个email是否在该s ...
- mysql----kill慢查询
每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILL thread_id语句终止一个线程. 如果您拥有SUPER权限,您 ...
- RMQ ---- ST(Sparse Table)算法
[概述] RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返 ...
- thinkphp3.0增加setInc、setDec方法
thinkphp3.0增加setInc.setDec方法 thinkphp3.0增加setInc.setDec方法,今天查看thinkphp2.0的方法setInc.setDec时是这样写的: 而对于 ...
- android新创建一个Activity时,会创建哪些部分
在创建时,会提示创建部分. 详细部分: