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

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. PHP 常用获取路径代码

    <? //获取当前的域名: echo $_SERVER['SERVER_NAME']; //获取来源网址,即点击来到本页的上页网址 echo $_SERVER["HTTP_REFERE ...

  2. android 开发 - 对图片进行虚化(毛玻璃效果,模糊)

    概述 IPAD,IPHONE上首页背景的模糊效果是不是很好看,那么在 Android中如何实现呢.我通过一种方式实现了这样的效果. 开源库名称:anroid-image-blur 一个android ...

  3. A Year Of Books - 2016 Javaer书单

    A Year Of Books - 2016 Javaer书单 (PS:欢迎留言推荐,很多来自白衣大哥的推荐) 1. OS & Networking <编码 : 隐匿在计算机软硬件背后的 ...

  4. [Z] 计算机类会议期刊根据引用数排名

    一位cornell的教授做的计算机类期刊会议依据Microsoft Research引用数的排名 link:http://www.cs.cornell.edu/andru/csconf.html Th ...

  5. The file 'MemoryStream' is corrupted! 的解决办法

    The file 'MemoryStream' is corrupted! Remove it and launch unity again! [Position > ] 有时候我们会遇到这个报 ...

  6. Eclipse中用Logcat调试程序

    调试程序的一种方法是用Logcat程序,在Eclipse中windows->show view->other->android->logcat可打开. 然后程序加入androi ...

  7. 在没安装OFFICE的服务器SSIS中进行EXCEL的ETL操作!

    由于OFFICE 2010的安装包比较庞大,如果仅仅为了在服务器中实现操作EXCEL,完全没有必要安装整个OFFICE,是否可以不装OFFICE也实现与OFFICE文件的互相操作呢?答案是肯定的,在S ...

  8. windbg加载sos.dll

    SOS.dll 中提供的 Son of Strike 扩展 (SOS),用于调试 WinDbg 中的托管代码.在启动了调试程序并将其附加到托管进程(或加载故障转储) .load C:\Windows\ ...

  9. 3-5年的PHPer常见的面试题

    看到有很多,的总结一下,比较适合有一定经验的PHPer 1.平时喜欢哪些php书籍及博客?CSDN.虎嗅.猎云 2.js闭包是什么? 3.for与foreach哪个更快? 4.php鸟哥是谁?能不能讲 ...

  10. [OpenCV] Face Detection

    即将进入涉及大量数学知识的阶段,先读下“别人家”的博文放松一下. 读罢该文,基本能了解面部识别领域的整体状况. 后生可畏. 结尾的Google Facenet中的2亿数据集,仿佛隐约听到:“你们都玩儿 ...