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获取它自身的一个实例,最经常使用的方法就是提供一个共同拥有的构造器. 另一种放你发,也应该子每一个程序猿的工具箱中占有一席之地.类能够提供一个共同拥有的静态 工厂方法.它 ...
随机推荐
- 再议gluPerspective和gluLookAt的关系
http://www.cnblogs.com/chengmin/archive/2011/09/12/2174004.html 看了Opengl的相关程序,发现有些东西还是特别迷茫,尤其是gluLoo ...
- Linux内核实践之tasklet机制【转】
转自:http://blog.csdn.net/bullbat/article/details/7423321 版权声明:本文为博主原创文章,未经博主允许不得转载. 作者:bullbat 源代码分析与 ...
- (二十四)linux新定时器:timefd及相关操作函数
timerfd是Linux为用户程序提供的一个定时器接口.这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,所以能够被用于select/poll的应用场景. 一,相关操作函数 #inclu ...
- oracle修改字段类型由varchar2修改为clob类型
oracle修改字段类型由varchar2修改为clob类型 http://blog.sina.com.cn/s/blog_9d12d07f0102vxis.html
- react 使用antd的TreeSelect树选择组件实现多个树选择循环
需求说明,一个帐号角色可以设置管理多个项目的菜单权限 且菜单接口每次只能查询特定项目的菜单数据[无法查全部] 开发思路: 1,获取项目接口数组,得到项目数据 2,循环项目数据,以此为参数递归查询菜单数 ...
- 四. Java继承和多态8.Java final关键字:阻止继承和多态
在 Java 中,声明类.变量和方法时,可使用关键字 final 来修饰.final 所修饰的数据具有“终态”的特征,表示“最终的”意思.具体规定如下: final 修饰的类不能被继承. final ...
- Intent创建Activity
1,布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- java amr格式转mp3格式(完美解决Linux下转换0K问题)
原文:http://linjie.org/2015/08/06/amr%E6%A0%BC%E5%BC%8F%E8%BD%ACmp3%E6%A0%BC%E5%BC%8F-%E5%AE%8C%E7%BE% ...
- DELPHI7下SUPPEROBJECT遍历子对象的name和value
DELPHI7下SUPPEROBJECT遍历子对象的name和value var ite: TSuperAvlIterator; while ite.MoveNext do begin if ite. ...
- How to Use Auto Layout in XCode 6 for iOS 7 and 8 Development
The Auto Layout is available on the Storyboard for iOS or OS X development since XCode 5. But, I did ...