zoukankan      html  css  js  c++  java
  • 第一条:考虑使用静态工厂方法代替构造器

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

    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 }
  • 相关阅读:
    9.11 eventbus
    9.10,,,实现new instanceof apply call 高阶函数,偏函数,柯里化
    9.9 promise实现 写完了传到gitee上面了,这里这个不完整
    9.5cors配置代码
    9.5 jsonp 实现
    9.5 http tcp https总结
    9.3 es6 class一部分 and es5 class 发布订阅
    8.30 cookie session token jwt
    8.30vue响应式原理
    warning: LF will be replaced by CRLF in renard-wx/project.config.json. The file will have its original line endings in your working directory
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4422288.html
Copyright © 2011-2022 走看看