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


1.why
a)有名称:假设有一个对象,这个对象有很多构造函数,并且构造函数返回内容不同,这时候如果没有文档就麻烦了,但是如果有个方法,这个方法有名称,跟明确的表示我是干嘛的,这时候就很容易记住了 (如:BigInteger.probablePrime())

b)不必每次都创建新对象
适用于单例模式

c)构成基于接口的框架
静态工厂方法返回对象所属的类可以是后来动态添加的,这样在返回对象是就比较灵活 (比如我们的代码中:用户下载网易云音乐有两个实现类,一个是移动端,一个是pc端,但是对于用户来说是看不到这两个实现类的,所以我们新增类杜宇用户来说是隐僻的)

d)创建泛型类实例的代码更为简洁
```
//使用构造器创建
Map<String, List<String>> m1 = new HashMap<String, List<String>>();
//使用静态工厂方法创建
Map<String, List<String>> m2 = HashMap.newInstance();
```

2.how


服务接口: 提供者实现 (应用市场对音乐客户端的规定)
提供者注册API: 系统用来注册实现,让客户端访问 (应用市场对商家的规定)
服务访问API: 客户端用来获取服务的实例 (网易云音乐(商家)向应用市场注册)
服务提供者接口: 负责创建其服务实现的实例 (用户下载客户端)


所谓服务提供者,就是说一方提供服务,比如网易云音乐;另一方消费服务,比如用户。而双方都要遵守应用市场的规定,网易云音乐根据规定将他们的服务放在应用市场上,用户从应用市场下载客户端软件并欣赏歌曲。为什么要用这样的框架呢?因为市场上可能有很多音乐提供商,比如酷狗音乐、QQ音乐、虾米音乐等等,用户可以随意选用任何一个商家的服务,而不必关心这个服务具体是如何实现的。

3.where
spring的Bean初始化最后一步注册bean就是通过该方法注册到IOC容器中


猜你喜欢

转载自blog.csdn.net/charjay_lin/article/details/80947312
今日推荐