静态工厂返回的对象所属的类,在编写包含该静态工厂方法的类的时候,可以不必存在.这种灵活的静态工厂方法构成了服务提供者框架的基础,例如JDBC的API.服务提供者框架是指这样一个系统:多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现.并把它们从多个实现中解耦出来.

  服务提供者框架包含四大组件-服务接口(提供者实现),提供者注册API(由系统用来注册实现),服务访问API(客户端用来访问服务的实例),服务提供者接口(服务者负责创建其服务实现的实例).下面的例子就是服务提供者框架的具体实现:

  首先是服务接口和服务提供者接口,服务提供者用来产生服务:

/*** * @author 胡龙海* 创建时间: 2017年4月4日* 服务接口*/
public interface Service {//Service方法.public void doService();
}

/*** * @author 胡龙海* 创建时间: 2017年4月4日* 服务提供者接口*/
public interface Provider {public Service newService();
}

  紧接着是服务提供者接口的实现和服务接口的实现:

public class StrongProvider implements Provider{@Overridepublic Service newService() {return new StrongService();}}
public class WeekProvider implements Provider{@Overridepublic Service newService() {return new WeekService();}}
public class WeekService implements Service{@Overridepublic void doService() {System.out.println("弱爆了");}}
public class StrongService implements Service{@Overridepublic void doService() {System.out.println("双击666");}}

  紧接着就是提供静态工厂了,我们通过静态工厂完成服务访问API,服务提供者注册API的编写:

/*** 静态工厂,提供服务* @author 胡龙海* 创建时间: 2017年4月4日*/
public class Services {private Services(){}    //保证该类是不可实例化的private static Map<String,Provider> providers=new HashMap<>();//一系列服务提供者private static String DEFAULT_PROVIDER_NAME="<def>";/*** 提供者注册API.(默认)* @author 胡龙海* 创建时间: 2017年4月4日* @param provider*/public static void registDefaultProvider(Provider provider) {providers.put(DEFAULT_PROVIDER_NAME, provider);}/*** 提供者注册API* @author 胡龙海* 创建时间: 2017年4月4日* @param providerName* @param provider*/public static void registProvider(String providerName,Provider provider) {providers.put(providerName, provider);}/*** 服务访问API,默认* @author 胡龙海* 创建时间: 2017年4月4日* @return*/public static Service newService() {return providers.get(DEFAULT_PROVIDER_NAME).newService();}/*** 服务访问API.* @author 胡龙海* 创建时间: 2017年4月4日* @param serviceName* @return*/public static Service newService(String serviceName) {return providers.get(serviceName).newService();}
}

  接着,我们就可以建立代码去测试了.可以去注册几个服务提供者,然后根据注册时的名字完成对于服务的调用.

public class TestService {@Testpublic void testService() {Services.registProvider("week",new WeekProvider());Services.registProvider("strong", new StrongProvider());Services.registDefaultProvider(new StrongProvider());Services.newService().doService();Services.newService("week").doService();}
}

  实际上,我们熟悉的JDBC编程就是基于这种服务提供者框架去实现的,其中Driver是服务提供者接口,Connection是服务接口,DriverManager.registDriver()是服务提供者注册API,而DriverManager.getConnection()是服务访问API.

转载于:https://www.cnblogs.com/hlhdidi/p/6666254.html

静态工厂方法之服务提供者框架相关推荐

  1. 第1条:考虑用静态工厂方法代替构造器

    为了获得一个类的实例,有两种办法1.类提供一个公有的构造器 2.类提供一个公有的静态工厂方法. 静态工厂方法的优势: 1.有名称. 慎重地选择方法名称能突出多个构造器的区别,例如使用BigIntege ...

  2. 使用静态工厂方法而不是构造器

    注意:静态工厂方法不是设计模式中的工厂方法. 一个类向客户端提供静态工厂方法有如下好处: 有名称,不用根据参数类型和顺序区分重载方法,让代码更易读 是否每次调用都需要新对象是可控制的,对于不可修改的对 ...

  3. 01、静态工厂方法替代构造器

    考虑用静态工厂方法替代构造器 考虑使用静态工厂方法来替代构造器的原因: 静态工厂方法有名称:普通的构造器中,参数并不能很好地描述返回对象的特点,代码的阅读性不好. 考虑下面的程序: Random ra ...

  4. 《Effective Java》学习笔记 - (1) 使用静态工厂方法代替构造器

    文章目录 前言 使用静态工厂方法代替构造器 1. 优点 1.1 静态工厂方法有名称 1.2 不必每次调用的时候都创建一个对象 1.3 可以返回类型的任何子类型的对象 1.4 所返回的对象的类型可以随着 ...

  5. 创建对象_工厂方法(Factory Method)模式 与 静态工厂方法

    工厂方法模式: 定义:为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟至子类. 应用场景: 客户类不关心使用哪个具体类,只关心该接口所提供的功能: 创建过程比较复杂,例如需 ...

  6. 实验5:配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、(FactoryBean测试)★

    实验5:配置通过静态工厂方法创建的bean.实例工厂方法创建的bean.(FactoryBean测试)★ bean的创建默认就是框架利用反射new出来的bean实例 工厂模式:工厂帮我们创建对象:有一 ...

  7. 一起读经典-《Effective Java》1.1 考虑使用静态工厂方法代替构造器

    1.静态工厂方法相较于构造器的优点 a.静态工厂方法能够自定义名称,使代码可读性更高 b.不必在每次调用的时候都创建新的实例 c.可以返回类型的子类型对象 2.静态工厂方法的常用名称: value o ...

  8. Java 静态工厂方法详解

    Java 静态工厂方法详解 本文章主要是对<Effective Java>对静态工厂方法的理解 第一次使用静态工厂方法是在HIT<Software Construction>课 ...

  9. 设计模式之简单工厂模式(静态工厂方法)

    模式定义: 从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象 ...

最新文章

  1. python的socket编程
  2. 三年开发项目经验总结
  3. 【Leetcode | 52】257. 二叉树的所有路径
  4. DotFuscator使用步骤
  5. 并查集 (Union-Find)算法
  6. visio 模具_Visio2013 自定义模具 简单公式
  7. python API url 级联生成
  8. 相机技术公司Lytro获6000万美元D轮融资,阿里巴巴参投
  9. linux mint 8812ac网卡,kali虚拟机连接无线网卡comfast cf-812AC(Realtek 8812BU芯片)(不支持wlan0mon)...
  10. 【越南风景梯田Win7主题】
  11. 二年级课程表(4月2日-4月8日)
  12. 多语言国际版在线聊天室/匿名在线聊天室/语音聊天室/网页APP聊天室
  13. linux 拷贝目录报错,Linux复制文件时出现omitting directory错误怎么办
  14. Real Digital德国站real.de怎么样?Payoneer绿色入驻通道!
  15. 魔兽怀旧服最新服务器人口,魔兽世界:仅三天时间正式服人口减少20万,怀旧服人口超越正式服...
  16. html阅读封面代码,HTML5/SVG 书本封面设计
  17. 主机win10与虚拟机win7相互ping通方法
  18. Anaconda中的spyder安装Terminal插件
  19. 定时器实验循环彩灯C语言,单片机实验三-定时器实验
  20. AS打包的应用安装时解析包错误或没有签名

热门文章

  1. 工业机器人码垛教学实施_工业码垛机器人存在问题与解决对策
  2. Phantomjs代理设置
  3. Spring Cloud 第一天课堂笔记
  4. GC(垃圾处理机制)面试加薪必备
  5. 宏基aspire拆机触摸_如何拆解宏基Acer Aspire 4530
  6. 针对校园某服务器的一次渗透测试
  7. 《网易编程题》计算糖果
  8. 蘑菇街2015校招 Java研发笔试题 详解,2015java
  9. Python输入多行多组数据两个两求和
  10. 约瑟夫环 java实现