多相关文章请参考:http://www.enjoytoday.cn/categorys/java

静态工厂模式给人的第一印象就是:static+abstract.这两个词汇已经说明了一切,一个是周期长,一个是返回值抽象,抽象一直都是java乃至编程中很受欢迎的词汇。但这种实现并不是万能的,也不可盲目使用,需要结合现实场景。就静态方式实现的场景总结如下:

  • 访问频率较高

    较高频率的访问通过该种方式实现可以有效减小每次重新创建对象的成本
  • 结构化接口工具类实现

    对于功能相似,代码复用较高的工具类操作通过基于接口的框架的实现方式可以简化大量代码实现,并可以直观的通过静态调用方法名称实现对象的获取,该类为操作性居多
  • 单例模式的不二之选

    单例实现的原由其实也是和其类似.
  • 服务提供者框架实现

    首先需要了解服务提供者框架做一个简单了解,服务提供者框架包括四个组成部分:

    1)服务接口:服务提供者实现部分

    2)提供者注册API:客户端用于注册服务系统实现的

    3)服务访问API:客户端用于获取服务实例的

    4)服务提供者接口(可选):提供者负责创建服务实现实例

    经典案例jdbc的实现:

     try{
    Class.forName("com.mysql.jdbc.Driver");//指定连接类型
    Connection conn = DriverManager.getConnection(url, user, password);//获取连接
    } catch (Exception e) {
    e.printStackTrace();
    }

    如上所示:Connection为服务接口,提供sql连接服务; Class.forName(“com.mysql.jdbc.Driver”)就是提供者注册API;DriverManager.getConnection就是服务访问API;”com.mysql.jdbc.Driver”这个类就是服务提供者接口.

如下给出一个简单的静态工厂的代码:

public interface Service{
void startService();
} public interface Provider{
Service getService();
} public class ServiceImp implement Service{ public void startService{
System.out.println("get serviceImpl start Service.");
} } public class ProviderImpl implement Provider{ static{
ServiceManager.register("test",new ProviderImpl());
} public Service getService(){
return new serviceImpl();
}
} public final class ServiceManager{
private Map<String,Provider> maps= new ConcurrentHashMap<>(); public static void register(String name,Provider provider){
if(name!=null && provider!=null && !maps.containKey(provider)){
maps.put(name,provider);
}else{
throw new IllegeException("invaild synax.");
} } public static Service getService(String key){
Provider provider=maps.get(key);
if(provider!=null){
return provider.getService();
}else{
throw new IllegeException("register provider first,please.");
}
}
} //使用
public class TestMain{ public static void main(String[] args){
Class.forName("xx.xxx.ProviderImpl");
Service service=ServiceManager.getService();
service.startService(); }
}

最新文章

  1. jieba中文分词的.NET版本:jieba.NET
  2. javascript 实现一个回文数字
  3. 然当装入Ubuntu双系统时,会出现无线硬件开关关闭的问题,当然也就无法连网
  4. json提交数据到服务端
  5. 【译】UNIVERSAL IMAGE LOADER. PART 3---ImageLoader详解
  6. HDU 4421 Bit Magic (图论-2SAT)
  7. 条款24:若所有的函数参数可能都需要发生类型转换才能使用,请采用non-member函数
  8. 第一个简单的android项目
  9. 调用AutoCAD的内置对话框
  10. SPRING IN ACTION 第4版笔记-第七章Advanced Spring MVC-006- 如何保持重定向的request数据(用model、占位符、RedirectAttributes、model.addFlashAttribute(&quot;spitter&quot;, spitter);)
  11. 利用Splatting提交参数(Hash,哈希)
  12. web领域的实时推送技术-WebSocket
  13. 华为SSH认证配置
  14. Glibc堆块的向前向后合并与unlink原理机制探究
  15. WebFrom 小程序【条件查询与分页整合】
  16. Git与GitHub学习笔记(三).gitignore文件忽略和删除本地以及远程文件
  17. python 的math模块
  18. Visual Studio 6 (VC6)连接Team Foundation Server (TFS 2018),实现源代码的版本管理
  19. Redis学习---Redis操作之Hash
  20. 超全面的JavaWeb笔记day05&lt;xml&amp;dtd&amp;jaxp&gt;

热门文章

  1. Go 自定义类型来实现枚举类型限制
  2. zabbix监控服务
  3. NIO基础方法一
  4. Nginx四层负载均衡概述
  5. fstab是什么?被谁用?怎么写?
  6. Java学习笔记(5)--- Number类和Math 类,String类的应用,Java数组入门
  7. ubuntu下使用redshift开启护眼模式
  8. 推荐几个公众号Markdown格式化网站
  9. WPF 精修篇 拖拽 DragDrop
  10. windows7 php 环境架设