【Effective Java】1、静态工厂的方式代替构造函数
使用一个服提供者对进行服务的提供,服务的请求通过不同的提供者提供不同的服务,服务提供者首先必须在工厂中进行注册,然后才可以通过工厂实例化服务
Service.java
package cn.xf.cp.ch02; /**
*
*功能:这是一个服务类
*时间:下午6:03:23
*文件:Service.java
*@author Administrator
*
*/
public interface Service
{
//比如服务类提供一个hello world的服务
public void sayHello();
}
Provider.java
package cn.xf.cp.ch02; /**
*
*功能:服务的提供者
*时间:下午6:05:29
*文件:Provider.java
*@author Administrator
*
*/
public interface Provider
{
public Service newInstance();
}
ServicesFactory.java
package cn.xf.cp.ch02; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /**
*
*功能:服务工厂,提供服务的实体类
* 这是是进行服务的注册和连接。只有先注册了的服务才可以进行连接9
*时间:下午6:06:32
*文件:ServicesFactory.java
*@author Administrator
*
*/
public class ServicesFactory
{
//构造函数私有化,避免别的调用者不通过静态工厂方法实例
private ServicesFactory(){}; //服务注册的时候保存在容器中,并如果没有指定的实例方式,那么还得设定一个默认的实例方式
private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); private static final String DEFAULT_PROVIDER_NAME = "<def>"; //进行注册方法的API,注册一个提供服务的人
public static void registerDfaultProvider(Provider p)
{
resgisterProvider(DEFAULT_PROVIDER_NAME, p);
} public static void resgisterProvider(String name, Provider p)
{
providers.put(name, p);
} //进行连接方法的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("这个提供服务的对象没有进行注册" + name);
} return p.newInstance();
}
}
测试代码
package cn.xf.cp.ch02; public class Test
{
public static void main(String[] args)
{
// 首先注册服务请求人
ServicesFactory.registerDfaultProvider(DEFAULT_PROVIDER);
ServicesFactory.resgisterProvider("comp", COMP_PROVIDER);
ServicesFactory.resgisterProvider("armed", ARMED_PROVIDER); // 实例化服务
Service s1 = ServicesFactory.newInstance(); // 默认的
Service s2 = ServicesFactory.newInstance("comp");
Service s3 = ServicesFactory.newInstance("armed"); s1.sayHello();
s2.sayHello();
s3.sayHello();
} private static Provider DEFAULT_PROVIDER = new Provider()
{
public Service newInstance()
{
return new Service()
{
@Override
public String toString()
{
return "Default service";
} @Override
public void sayHello()
{
System.out
.println(
"DEFAULT_PROVIDER这个排版很有问题啊"); }
};
} }; private static Provider COMP_PROVIDER = new Provider()
{
public Service newInstance()
{
return new Service()
{
@Override
public String toString()
{
return "Complementary service";
} @Override
public void sayHello()
{
System.out
.println(
"COMP_PROVIDER这个排版很有问题啊"); }
};
}
}; private static Provider ARMED_PROVIDER = new Provider()
{
public Service newInstance()
{
return new Service()
{
@Override
public String toString()
{
return "Armed service";
} @Override
public void sayHello()
{
System.out
.println(
"ARMED_PROVIDER这个排版很有问题啊"); }
};
}
};
}
结果显示:

【Effective Java】1、静态工厂的方式代替构造函数的更多相关文章
- Effective Java —— 用静态工厂方法代替构造器
本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...
- Effective Java 之-----静态工厂与构造器
一. 考虑用静态工厂方法代替构造器: 1)静态工厂方法与构造器不同的第一大优势在于:他们有名称.当一个类需要多个带有相同签名的构造器时,就用静态方法代替构造器,并慎重的选择名称以突出他们间的区别: 2 ...
- Java 的静态工厂方法
本文转载自:https://www.jianshu.com/p/ceb5ec8f1174 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器不同的第一优势在于,它们有名 ...
- ej3-1优先使用静态工厂方法而非构造函数来创建对象
背景 很早之前就已经自己翻译了,先简单的贴出来,并做一下回顾. 条款1 优先使用静态工厂方法而非构造函数来创建对象 允许客户端创建一个实例的传统方法是:提供一个公共构造函数:有另外一个必须成为每个程序 ...
- Java - 用静态工厂方法代替构造器
Effective Item - 考虑用静态工厂方法代替构造器我们有两种常见的方法获得一个类的实例: 公有的构造器 提供静态工厂方法(static factory method) 相对公有的构造器,静 ...
- Java设计模式———静态工厂
上课时yqj2065要求:除了JDK等框架或工具中的类,自己编写的类不得使用new创建对象(Test除外). 据说是因为使用new会涉及到硬编码.(不是很懂) 所以要求用God类利用反射+配置文件来创 ...
- java静态工厂
本文摘自:https://www.jianshu.com/p/ceb5ec8f1174 本文略长,所以先来个内容提要 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器 ...
- Java学习笔记(十四)——Java静态工厂
[前面的话] 每天过的还行,对我来说,只要让自己充实,生活就会是好的. 学习Java工场方法的原因是最近在使用Spring框架做一个系统,其中有一个注入的方法是使用静态工场方法注入,所以学习一下,基础 ...
- Effective Java - 静态方法与构造器
目录 用静态工厂方法替代构造器? 静态工厂有名称 静态工厂不必重新创建一个对象 静态工厂可以返回任何子类型对象 静态工厂返回的类可以动态变化 静态工厂返回的类可以不存在 静态工厂方法的缺点 静态工厂方 ...
随机推荐
- 没有 RunInstallerAttribute.Yes 的公共安装程序。在 C:/Program/xx.exe 程序集中可能可以找到
今天在装服务的时候,装了半天总是提示 没有 RunInstallerAttribute.Yes 的公共安装程序.在 C:/Program/xx.exe 程序集中可能可以找到“Yes”属性. 才发现同事 ...
- Show Linux Package Sort By Size
ArchLinux: ~ $ pacsysclean Debian: ~ $ sudo apt-get install debian-goodies ~ $ dpigs -H
- keil l251 command summary --Lib
keil l251 command summaryLIB251 LIST MYLIB.LIB TO MYLIB.LST PUBLICS LIB251 EXTRACT MYLIB.LIB (GOODCO ...
- RTImageAssets 自动生成 AppIcon 和 @2x @1x 比例图片
下载地址:https://github.com/rickytan/RTImageAssets 此插件用来生成 @3x 的图片资源对应的 @2x 和 @1x 版本,只要拖拽高清图到 @3x 的位置上,然 ...
- iOS开发-pod install 出错 The dependency `AFNetworking (~> 2.6.0)` is not used in any concrete target.
低版本的cocoapods的Podfile文件pod install可以正常运行 platform :ios, '8.0' pod 'AFNetworking' 高版本的cocoapods的Podfi ...
- wireshark解密本地https流量笔记
此方式支持firefox,chrome 建立path变量 SSLKEYLOGFILE=c:\ssl.key 重启firefox chrome,访问https网站会自动生成ssl session key ...
- C2C,B2C,F2C三种电商运营模式的比较
第三方模式(C2C) 销售商模式(B2C) 生产商模式(F2C) 概念及简介 第三方平台提供商模式是电子商务的最原始也是最自然的形式.这种模式一般都是由信息技术开发商负责建立平台,利用平台扩展电子 ...
- nginx 常用配置说明
一.location 配置 1.1 语法规则: location [=|~|~*|^~] /uri/ { … }= 开头表示精确匹配^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可 ...
- 禁用iPhone手机浏览器上给电话号码自动加上的link样式
iPhone手机上的浏览器(如Safari),在解析网页的时候会自动给 像是电话号码的数字 加上link样式. 可以添加下面的meta禁用掉这个功能. // //
- 用JavaScript修改浏览器tab标题
修改tab或者window的标题,是一项较老的实践.Gmail 用它来提示用户新的聊天消息,当有新的page通过AJAX加载的时候,本站同样用它更新tab title.这是怎样做到的呢?当时是通过设置 ...