读书,有时候,我感觉总是有点绕和不具体。我阅读了代码,理解代码后,才有一种理解和把握的感觉。

优点三、
 
把某个对象的构建放给客户端来实现。
比如下面的实现,客户端Test,获取Service的实例具体类型,是由服务提供者Provider来确定的。
 
Services暴露服务提供者的注册方法,不同的服务提供者,会提供不同的实例。如下文,实现了DEFAULT_PROVIDER, COMP_PROVIDER, ARMED_PROVIDER三个服务提供者。
将服务提供者注册到Services中,用名称区别不同的服务提供者。
 
于是,客户端Test,在获取实例的时候,传递对应的服务提供者名称给Services,这样就可以获取指定类型的实例。
比如,Service s2 = Services.nexInstance("comp").获取的实例类型,是由COMP_PROVIDER来决定的。
  1. // Simple test program for service provider framework
  2. package org.effectivejava.examples.chapter02.item01;
  3.  
  4. public class Test {
  5. public static void main(String[] args) {
  6. // Providers would execute these lines
  7. Services. registerDefaultProvider(DEFAULT_PROVIDER);
  8. Services. registerProvider("comp", COMP_PROVIDER);
  9. Services. registerProvider("armed", ARMED_PROVIDER);
  10.  
  11. // Clients would execute these lines
  12. Service s1 = Services.newInstance();
  13. Service s2 = Services.newInstance("comp" );
  14. Service s3 = Services.newInstance("armed" );
  15. System. out.printf("%s, %s, %s%n" , s1, s2, s3);
  16. }
  17.  
  18. private static Provider DEFAULT_PROVIDER = new Provider() {
  19. public Service newService() {
  20. return new Service () {
  21. @Override
  22. public String toString() {
  23. return "Default service" ;
  24. }
  25. };
  26. }
  27. };
  28.  
  29. private static Provider COMP_PROVIDER = new Provider() {
  30. public Service newService() {
  31. return new Service () {
  32. @Override
  33. public String toString() {
  34. return "Complementary service" ;
  35. }
  36. };
  37. }
  38. };
  39.  
  40. private static Provider ARMED_PROVIDER = new Provider() {
  41. public Service newService() {
  42. return new Service () {
  43. @Override
  44. public String toString() {
  45. return "Armed service" ;
  46. }
  47. };
  48. }
  49. };
  50. }

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  1. import java.util.Map;
  2. import java.util.concurrent.ConcurrentHashMap;
  3.  
  4. public class Services {
  5. private Services() {
  6. } // Prevents instantiation (Item 4)
  7.  
  8. // Maps service names to services
  9. private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();
  10. public static final String DEFAULT_PROVIDER_NAME = "<def>";
  11.  
  12. // Provider registration API
  13. public static void registerDefaultProvider(Provider p) {
  14. registerProvider(DEFAULT_PROVIDER_NAME, p);
  15. }
  16.  
  17. public static void registerProvider(String name, Provider p) {
  18. providers.put(name, p);
  19. }
  20.  
  21. // Service access API
  22. public static Service newInstance() {
  23. return newInstance( DEFAULT_PROVIDER_NAME);
  24. }
  25.  
  26. public static Service newInstance(String name) {
  27. Provider p = providers.get(name);
  28. if (p == null )
  29. throw new IllegalArgumentException(
  30. "No provider registered with name: " + name);
  31. return p.newService();
  32. }
  33. }

--------------------------------------------------------------------------------------------------------------------------------------------------------

  1. //在接口中,可以定义要客户端实现的方法
  2. public interface Service {
  3. // Service-specific methods go here
  4. }

-------------------------------------------------------------------------------------------------------------------------------------------------------

  1. // Service provider framework sketch - Service provider interface - Page 12
  2. package org.effectivejava.examples.chapter02.item01;
  3.  
  4. public interface Provider {
  5. Service newService();
  6. }

  

Item 1----------考虑用静态工厂方法代替构造器的更多相关文章

  1. Java - 用静态工厂方法代替构造器

    Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...

  2. 静态工厂方法VS构造器

    我之前已经介绍过关于构建者模式(Builder Pattern)的一些内容,它是一种很有用的模式用于实例化包含几个属性(可选的)的类,带来的好处是更容易读.写及维护客户端代码.今天,我将继续介绍对象创 ...

  3. 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器

    类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...

  4. 改善JAVA代码01:考虑静态工厂方法代替构造器

    前言 系列文章:[传送门]   每次开始新的一本书,我都会很开心.新书新心情. 正文 静态工厂方法代替构造器 说起这个,好多可以念叨的.做了一年多的项目,慢慢也有感触. 说起构造器 大家很明白,构造器 ...

  5. Effective java读书札记第一条之 考虑用静态工厂方法取代构造器

    对于类而言,为了让client获取它自身的一个实例,最经常使用的方法就是提供一个共同拥有的构造器. 另一种放你发,也应该子每一个程序猿的工具箱中占有一席之地.类能够提供一个共同拥有的静态 工厂方法.它 ...

  6. 【读书笔记 - Effective Java】01. 考虑用静态工厂方法代替构造器

    获取类的实例有两种方法: 1. 提供一个公有的构造器(最常用). 2. 提供一个公有的静态工厂方法(static factory method). // 静态工厂方法示例 public static ...

  7. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  8. effective java 3th item1:考虑静态工厂方法代替构造器

    传统的方式获取一个类的实例,是通过提供一个 public 构造器.这里有技巧,每一个程序员应该记住.一个类可以对外提供一个 public 的 静态工厂方法 ,该方法只是一个朴素的静态方法,不需要有太多 ...

  9. Tips1:考虑用静态工厂方法代替构造器

    用静态工厂方法来代替构造器为外界提供对象 描述: 静态工厂方法代替构造器来给外界提供对象,创建对象依然是由构造器来完成的 创建对象和提供对象: 创建对象的方式: 构造器 提供对象来哦方式: 构造器 类 ...

随机推荐

  1. iOS- xib(nib) 的重用(在有些情况下有利于加快项目功能的实现)

    0.前言 在项目开发中,我们经常会碰到,某些视图View 内部基本空间都一样,只是数据不同,这时,我们可以用xib来将这个视图封装起来多次重用, (例如,大小固定 控件固定的TableViewCell ...

  2. JAVA学习之HashCode

    public native int hashCode(); 返回该对象的哈希码值.支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能. 一.HashCode ...

  3. [OS] 操作系统基本类型

    ·批处理系统:(用户脱机使用.成批处理.多道程序运行) 批处理系统,又名批处理操作系统.批处理是指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行.这种采用批量处理作业技术的操作系 ...

  4. 第25天:js-封装函数-淘宝鼠标展示

    封装函数: 1.函数形参相当于变量,不能加引号. 2.实参要和形参一一对应. 案例:鼠标移到小图上,背景展示相应放大的图片.代码如下: <!DOCTYPE html> <html l ...

  5. echart模块化单文件引入

    echart模块化单文件引入百度上面是推荐这样使用.今天看了一下,做了个Demo. 文件结构如下:

  6. 前台界面(2)---CSS 样式

    目录 1. 内联样式 2. 层叠样式表CSS 2.1. 类选择器 2.1.1. 颜色设置 2.1.2. 字号设置 2.1.3. CSS边框属性 2.1.4. 设置背景颜色 2.1.5. 设置布局边框 ...

  7. P1315 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  8. 转:Conjugate prior-共轭先验的解释

    Conjugate prior-共轭先验的解释    原文:http://blog.csdn.net/polly_yang/article/details/8250161 一 问题来源: 看PRML第 ...

  9. CF757G Can Bash Save the Day?

    CF757G Can Bash Save the Day? #include<bits/stdc++.h> #define RG register #define IL inline #d ...

  10. POJ2728:Desert King——题解

    http://poj.org/problem?id=2728 题目大意:求一棵生成树使得路费用和/路长之和最小(路的费用是两端点的高度差) 最小比率生成树. 我们还是01分数规划的思想将边权变为路费用 ...