• 第一条:考虑使用静态工厂方法代替构造器


    使用静态工厂方法代替构造器的几大优势:

    1. 静态工厂方法具有名称。 可以通过它的名称来判断它返回的实例的大概信息。
    2. 不必再每次调用时都创建一个新的实例。  例如单例类就使用了静态工厂方法。
    3. 静态工厂方法可以返回原返回类型的任何子类型的对象实例。   如返回类型是Service,可以返回Service类型的任何子类型
    4. 在创建参数化类型的实例时,静态工厂方法使代码变得更加简洁。

    静态工厂方法的一些惯用名称:

    1. valueOf    该方法返回的实例与它的参数具有相同的值。它实际上时做类型转化的。
    2. of    valueOf的一种更为简洁的替代。
    3. getInstance   返回的实例通过方法参数来描述。对于单例类,该方法没有参数,并返回唯一的实例。
    4. newInstance     返回的实例通过方法参数来描述。每次返回的都是一个新的实例对象。
    5. getType      Type指明返回的实例的类型。   
    6. newType     Type指明返回的实例的类型。

    利用静态工厂方法实现的服务提供者框架模式  :

    服务接口  :

    1 public interface Service {
    2      /**
    3       * n种服务
    4       */
    5     //.....
    6 }

    服务提供者接口:

    1 public interface Provider {
    2      /**
    3       * 可以提供的n种服务
    4       */
    5      Service  newService();
    6 }

    具有服务提供者注册API和服务访问API的  服务类:

     1 public class Services {
     2     //私有化构造器   通过静态工厂方法来得到想要的Service实例
     3     private Services(){}
     4     //用来保存服务提供者对象的Map对象
     5     private static  final Map<String, Provider> providerMap = new HashMap<String, Provider>();
     6     //服务提供者对象的默认 key值
     7     private static  final String DEFAULT_NAME = "<def>";
     8     
     9     //提供静态工厂方法     将未提供key值得服务提供者对象 添加到Map对象中
    10     public static void  registerProvider(Provider provider)
    11     {
    12         registerProvider(Services.DEFAULT_NAME, provider);
    13     }
    14     
    15     //提供静态工厂方法     将提供key值的服务提供者对象 添加到Map对象中
    16     public static void  registerProvider(String name , Provider provider)
    17     {
    18         providerMap.put(name, provider);
    19     }
    20     
    21     //提供静态工厂方法   得到最终的服务对象
    22     public static Service newInstance()
    23     {
    24         return newInstance(DEFAULT_NAME);
    25     }
    26     //提供静态工厂方法   得到最终的服务对象 
    27     public static  Service newInstance(String name)
    28     {
    29         Provider p = providerMap.get(name);
    30         
    31         if(p == null)
    32         {
    33             throw new IllegalArgumentException("This provider not found");
    34         }
    35         
    36         return p.newService();
    37     }
    38 }
  • 相关阅读:
    Python:异常(待续)
    Python:函数解释(面向过程)
    MicroK8s第一篇:
    k8s第一篇:
    VMware Workstation centos7 虚拟机桥接方式联网,获取动态IP
    使用Java Service Wrapper在Linux下配置Tomcat应用
    Log4j 2.0读取配置文件的方法
    SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例
    jar包读取配置文件
    Java Service Wrapper 发布Java程序或者jar包为Windows服务
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4422288.html
Copyright © 2020-2023  润新知