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

优点三、
 
把某个对象的构建放给客户端来实现。
比如下面的实现,客户端Test,获取Service的实例具体类型,是由服务提供者Provider来确定的。
 
Services暴露服务提供者的注册方法,不同的服务提供者,会提供不同的实例。如下文,实现了DEFAULT_PROVIDER, COMP_PROVIDER, ARMED_PROVIDER三个服务提供者。
将服务提供者注册到Services中,用名称区别不同的服务提供者。
 
于是,客户端Test,在获取实例的时候,传递对应的服务提供者名称给Services,这样就可以获取指定类型的实例。
比如,Service s2 = Services.nexInstance("comp").获取的实例类型,是由COMP_PROVIDER来决定的。
// Simple test program for service provider framework
package org.effectivejava.examples.chapter02.item01; public class Test {
public static void main(String[] args) {
// Providers would execute these lines
Services. registerDefaultProvider(DEFAULT_PROVIDER);
Services. registerProvider("comp", COMP_PROVIDER);
Services. registerProvider("armed", ARMED_PROVIDER); // Clients would execute these lines
Service s1 = Services.newInstance();
Service s2 = Services.newInstance("comp" );
Service s3 = Services.newInstance("armed" );
System. out.printf("%s, %s, %s%n" , s1, s2, s3);
} private static Provider DEFAULT_PROVIDER = new Provider() {
public Service newService() {
return new Service () {
@Override
public String toString() {
return "Default service" ;
}
};
}
}; private static Provider COMP_PROVIDER = new Provider() {
public Service newService() {
return new Service () {
@Override
public String toString() {
return "Complementary service" ;
}
};
}
}; private static Provider ARMED_PROVIDER = new Provider() {
public Service newService() {
return new Service () {
@Override
public String toString() {
return "Armed service" ;
}
};
}
};
}

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

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; public class Services {
private Services() {
} // Prevents instantiation (Item 4) // Maps service names to services
private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();
public static final String DEFAULT_PROVIDER_NAME = "<def>"; // Provider registration API
public static void registerDefaultProvider(Provider p) {
registerProvider(DEFAULT_PROVIDER_NAME, p);
} public static void registerProvider(String name, Provider p) {
providers.put(name, p);
} // Service access API
public static Service newInstance() {
return newInstance( DEFAULT_PROVIDER_NAME);
} public static Service newInstance(String name) {
Provider p = providers.get(name);
if (p == null )
throw new IllegalArgumentException(
"No provider registered with name: " + name);
return p.newService();
}
}

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

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

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

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

  

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- 优化与封装 APP音效的播放

    1.关于音效 音效又称短音频,是一个声音文件,在应用程序中起到点缀效果,用于提升应用程序的整体用户体验.   我们手机里常见的APP几乎都少不了音效的点缀.   显示实现音效并不复杂,但对我们App很 ...

  2. python爬虫 妹子图片网

    代码如下 #coding=utf-8 import os import re import urllib from time import sleep import requests from lxm ...

  3. Linux面试题汇总答案(转)

    转自:小女生的Linux技术~~~Linux面试题汇总答案~~ 一.填空题:1. 在Linux系统中,以 文件 方式访问设备 .2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的 ...

  4. lucene 学习之基础篇

    一.什么是全文索引 全文检索首先将要查询的目标文档中的词提取出来,组册索引(类似书的目录),通过查询索引达到搜索目标文档的目的,这种先建立索引,再对索引进行搜索的过程就叫全文索引. 从图可以看出做全文 ...

  5. springBoot配置分析(属性和结构化)

    使用idea自带插件创建项目 一直下一步到完成 application.properties local.ip.addr = 192.168.2.110 redis.host = 192.168.3. ...

  6. web服务器压测工具siege、ab

    web服务器压测工具也挺多,这里只介绍我用过的这两种--siege(for linux).ab(for windows). 一.siege 1.简介: Siege是一款开源的压力测试工具,设计用于评估 ...

  7. [洛谷P3833][SHOI2012]魔法树

    题目大意:给一棵树,路径加,子树求和 题解:树剖 卡点:无 C++ Code: #include <cstdio> #include <iostream> #define ma ...

  8. 如何提升集群资源利用率? 阿里容器调度系统Sigma 深入解析

    阿里妹导读:为了保证系统的在线交易服务顺利运转,最初几年,阿里都是在双11大促来临之前大量采购机器储备计算资源,导致了双11之后资源大量闲置点现象.是否能把计算任务与在线服务进行混合部署,在现有弹性资 ...

  9. 20165218 2017-2018-1 《Java程序设计》第四周学习总结

    20165218 2017-2018-1 <Java程序设计>第四周学习总结 教材学习内容总结 第五章 子类与继承 子类与父类 通过关键字extands定义子类 class 子类 exta ...

  10. HDOJ(HDU).1035 Robot Motion (DFS)

    HDOJ(HDU).1035 Robot Motion [从零开始DFS(4)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DF ...