【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 - 静态方法与构造器
目录 用静态工厂方法替代构造器? 静态工厂有名称 静态工厂不必重新创建一个对象 静态工厂可以返回任何子类型对象 静态工厂返回的类可以动态变化 静态工厂返回的类可以不存在 静态工厂方法的缺点 静态工厂方 ...
随机推荐
- Web Uploader文件上传插件
http://www.jq22.com/jquery-info2665 插件描述:WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现 ...
- uniGUI试用笔记(十五)通过URL控制参数
通过URL代入参数,在代码中读取,如: http://localhost:8501/?ServerPort=212&&ServerIP=192.168.31.12 在代码中可以通过: ...
- LeetCode: 221_Maximal Square | 二维0-1矩阵中计算包含1的最大正方形的面积 | Medium
题目: Given a 2D binary matrix filled with 's and return its area. For example, given the following ma ...
- 对android应用一些破解的方法
因为需要破解一款应用,找了些资料 Android手机中的程序文件夹拷贝到别的Android手机上还能用么? xx.apk Android个人破解应用新思路 安卓手机下xx.apk JAVA破解之旅 s ...
- 更改linux文件夹的默认颜色
我不知道正常人看Linux下面文件夹的颜色(默认为深蓝)是不是有点晕晕的,看不清楚,反正对我这样的色弱的人来说,我看着很不爽,所以我到网上去找了一下,如果修改文件夹颜色的方法,网上真实众说纷纭,很多都 ...
- ServiceStack 介绍
关于ServiceStack ServiceStack 官网介绍: Opensource .NET and Mono REST Web Services framework 什么是 ServiceSt ...
- hibernate的多对多例子讲解(加图片)
在hibernate中也有多对多的关系.但是这样关系执行的效率不高,所以我们可以通过两个多对1或者两个1对多来实现. 在现实生活中多对多的关系也比较常见.比如说老师和学生.一个老师有多个学生,一个学生 ...
- django 快速实现登录
前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说不具有很强的操作性:对于web ...
- Android下拉刷新底部操作栏的隐藏问题
最近自己编写下拉刷新的时候,发现了一个问题,就是有一个需求是这样的:要求页面中是一个Tab切换界面,一个界面有底部操作栏,不可下拉刷新,另一个界面没有底部操作栏,但可以下拉刷新. 按照平常的做法,我在 ...
- tips null和undefined的区别
tips null和undefined的区别 1.undefined类型 undefined类型只有一个值,即特殊的undefined.在使用var声明变量但未对其加以初始化时,这个变量的值就是und ...