【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 - 静态方法与构造器
目录 用静态工厂方法替代构造器? 静态工厂有名称 静态工厂不必重新创建一个对象 静态工厂可以返回任何子类型对象 静态工厂返回的类可以动态变化 静态工厂返回的类可以不存在 静态工厂方法的缺点 静态工厂方 ...
随机推荐
- [原创]HierarchyView的实现原理和Android设备无法使用HierarchyView的解决方法
最近在看一个老外写的东西,发现里面有个类,使用这个类可以让任何设备使用HierarchyView. 众所周知,市面上卖的Android设备,一般都不能使用HierarchyView,所以借此机会,了解 ...
- 构建基于WinRT的WP8.1 App 03:Page控件
单页面模板 通常利用Visual Studio 2013创建的最简单的WP8.1应用是Blank App,它只包含一个不带任何UI的页面,并且没有任何状态管理的逻辑. 该不带任何UI的页面称为Blan ...
- 30分钟入门Java8之默认方法和静态接口方法
30分钟入门Java8之默认方法和静态接口方法 前言 上一篇文章30分钟入门Java8之lambda表达式,我们学习了lambda表达式.现在继续Java8新语言特性的学习,今天,我们要学习的是默认方 ...
- adb permission denied
1.没有得到root权限,可以用刷机精灵一键root. 2.root不彻底,手机安装超级adbd,即可.
- 求拓扑排序的数量,例题 topcoder srm 654 div2 500
周赛时遇到的一道比较有意思的题目: Problem Statement There are N rooms in Maki's new house. The rooms are number ...
- 获取ACCESS数据库中自增变量的值
/// <summary> /// 获取自增变量值 /// </summary> /// <returns>自增变量值</returns> public ...
- [iOS]关于状态栏(UIStatusBar)的若干问题
版本: OS X 10.10.5 Xcode 6.4(6E35b) iOS >= 7 一.概述 状态栏(UIStatusBar)指iPhone/iPad/iPod屏幕顶部用于显示网络.时间和电量 ...
- C# 通过WebService方式 IIS发布网站 上传文件到服务器
应用场景:要将本地的文件 上传到服务器的虚拟机上 网络环境:公司局域网(如下图中第二种) 开发环境:VS2010 服务器环境:WinServer2008 虚拟机环境:WinServer2008 ...
- [Linux] 查看系统启动时间
查找系统最后启动时间 1. 使用 who 命令 who -b 输出: system boot 2015-10-14 00:51 2. 使用 last 命令 last reboot | head -1 ...
- AutoLayout那些坑
最近在做一个聊天界面,要适配iOS所有屏幕. 以前的思路是键盘弹出的时候去改table 和输入框的frame. 现在发现和autolayout的约束有冲突. 搞了半天发现需要动态改Constraint ...