使用一个服提供者对进行服务的提供,服务的请求通过不同的提供者提供不同的服务,服务提供者首先必须在工厂中进行注册,然后才可以通过工厂实例化服务

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、静态工厂的方式代替构造函数的更多相关文章

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

    本文参考 本篇文章参考自<Effective Java>第三版第一条"Consider static factory methods instead of constructor ...

  2. Effective Java 之-----静态工厂与构造器

    一. 考虑用静态工厂方法代替构造器: 1)静态工厂方法与构造器不同的第一大优势在于:他们有名称.当一个类需要多个带有相同签名的构造器时,就用静态方法代替构造器,并慎重的选择名称以突出他们间的区别: 2 ...

  3. Java 的静态工厂方法

    本文转载自:https://www.jianshu.com/p/ceb5ec8f1174 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器不同的第一优势在于,它们有名 ...

  4. ej3-1优先使用静态工厂方法而非构造函数来创建对象

    背景 很早之前就已经自己翻译了,先简单的贴出来,并做一下回顾. 条款1 优先使用静态工厂方法而非构造函数来创建对象 允许客户端创建一个实例的传统方法是:提供一个公共构造函数:有另外一个必须成为每个程序 ...

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

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

  6. Java设计模式———静态工厂

    上课时yqj2065要求:除了JDK等框架或工具中的类,自己编写的类不得使用new创建对象(Test除外). 据说是因为使用new会涉及到硬编码.(不是很懂) 所以要求用God类利用反射+配置文件来创 ...

  7. java静态工厂

    本文摘自:https://www.jianshu.com/p/ceb5ec8f1174 本文略长,所以先来个内容提要 序:什么是静态工厂方法 Effective Java 2.1 静态工厂方法与构造器 ...

  8. Java学习笔记(十四)——Java静态工厂

    [前面的话] 每天过的还行,对我来说,只要让自己充实,生活就会是好的. 学习Java工场方法的原因是最近在使用Spring框架做一个系统,其中有一个注入的方法是使用静态工场方法注入,所以学习一下,基础 ...

  9. Effective Java - 静态方法与构造器

    目录 用静态工厂方法替代构造器? 静态工厂有名称 静态工厂不必重新创建一个对象 静态工厂可以返回任何子类型对象 静态工厂返回的类可以动态变化 静态工厂返回的类可以不存在 静态工厂方法的缺点 静态工厂方 ...

随机推荐

  1. JSP Servlet性能分析

    JSP Servlet性能分析:http://www.docin.com/p-757790851.html

  2. 如何通过XShell传输文件

    转载孟光孟叔的博客:  https://learndevops.cn/index.php/2016/06/14/how-to-transfer-file-using-xshell xshell目前最好 ...

  3. C用函数指针模拟重载 C++重载

    C中为什么不支持重载,即同一作用域内不允许出现同名函数? 我们都知道重载是c++面向对象的特性.c语言中是不存在的.所谓重载简单来说就是一个函数名可以实现不同的功能,要么输入参数不同或者参数个数不同, ...

  4. PlayFramework 1.2.x 在Controller 中识别JSON提交

    链接 http://stackoverflow.com/questions/6132892/consuming-json-in-play-framework-controller @Global pu ...

  5. Windows Phone 支持中国移动官方支付

    今天在这里与大家分享一个好消息,Windows Phone 官方支付支持中国移动(MO Payment),在此之前无论是 Windows Phone 的用户还是开发者,都知道在Windows Phon ...

  6. Oracle数据库入门——初级系列教程

  7. SQL Server 问题 1 - SQL Server encountered error 0x80070422/0x8007042d

    今天执行SQL Server 2014的full-text search 查询操作:select * from table where contains(summary, 'smith') 报出如下错 ...

  8. [原]如何在Android用FFmpeg解码图像

    前一篇[原]如何用Android NDK编译FFmpeg 我们知道了如何使用NDK来编译Android平台下使用的FFmpeg动态库.这篇文章我们就可以使用Android下的JNI来调用FFMpeg进 ...

  9. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  10. MyBatis知多少(20)MyBatis读取操作

    上篇展示了如何使用MyBatis执行创建操作表.本章将告诉你如何使用MyBatis来读取表. 我们已经在MySQL下有EMPLOYEE表: CREATE TABLE EMPLOYEE ( id INT ...