zoukankan      html  css  js  c++  java
  • Java 静态工厂模式的使用

    多相关文章请参考: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();
    
    
       }
    }
  • 相关阅读:
    锻炼记录
    PHP学习笔记
    返回一个整数数组中最大子数组的和(2)
    四则运算的在线答题(判断对错,记录错题)
    返回一个二维整数数组的最大子数组的和
    返回一个整数数组中最大子数组的和
    程序2:支持真分数的四则运算
    程序1:四则运算
    四则运算3.0版本
    返回二维数组子数组和最大值
  • 原文地址:https://www.cnblogs.com/amiko/p/7906226.html
Copyright © 2011-2022 走看看