国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

考慮使用靜態工廠方法代替構造方法

2019-11-18 13:17:12
字體:
來源:轉載
供稿:網友

  我們要得到一個對象,馬上想到構造方法,其實,靜態工廠方法也可以替我們做到。例如,在jdk1.4里面,Boolean用了一個靜態方法來得到一個boolean對象:
  public static Boolean valueOf(boolean b)
  
  question:這個方法實際上并不返回一個object?
  對的, sun的jdk 幫助里面講: If a new Boolean instance is not required, this method should generally be used in PReference to the constrUCtor Boolean(boolean).
  
  但是,不是說靜態工廠方法所有時候都不返回一個object,只是不是所有時候都返回一個object。
  
  使用靜態工廠方法和構造方法比較的優缺點:
  優點:
  1. 靜態工廠方法都是有自己的名字,輕易理解.
  2. 靜態工廠方法并不要求每次都生成一個對象.比如上面提到的Boolean的public static Boolean valueOf(boolean b)就不會返回一個object. sun的jdk幫助文檔里面也提到,在不需要得到一個對象的情況下,使用valueof方法可以得到性能的提升.
  而且這樣,可以控制類在生的期間該類的句柄數,這個作用在單態(item 21)和類型安全(item 21)都是有用的.
  3. 靜態工廠方法可以返回該類的任何子類,這給了程序員更大的選擇空間.
  比如Collections,用了很多靜態工廠方法來得到immuable的set,map之類的.
  而且靜態工廠方法可以強迫user通過接口來引用被返回的對象,而不是每次都使用構造函數,這是一個好習慣.
  靜態工廠方法返回的類,在編寫含有靜態工廠方法這個類的時候,可以并不存在,這就提供了一種靈活的service provider framework.比如java的密碼系統擴展(JCE),provider為user提供多個api實現,framework提供一種機制來register這些實現,用戶只需直接使用api,而不用考慮自己在使用哪個實現。
  下面是這種機制的程序框架:
  [code]import java.util.*;
  // Provider framework sketch
  public abstract class Foo {
    // Maps String key to corresponding Class object
    private static Map implementations = null;
    // Initializes implementations map the first time it's called
    private static synchronized void initMapIfNecessary() {
      if (implementations == null) {
        implementations = new HashMap();
  
        // Load implementation class names and keys from
        // Properties file, translate names into Class
        // objects using Class.forName and store mappings.
        // ...
      }
    }
    public static Foo getInstance(String key) {
      initMapIfNecessary();
      Class c = (Class) implementations.get(key);
      if (c == null)
        return new DefaultFoo();
      try {
        return (Foo) c.newInstance();
      } catch (Exception e) {
        return new DefaultFoo();
      }
    }
    public static void main(String[] args) {
      System.out.println(getInstance("NonexistentFoo"));
    }
  }
  class DefaultFoo extends Foo {
  }[/code]
  靜態工廠方法的缺點:
  1. 僅僅有靜態工廠方法而沒有public的構造方法的類不能被繼續…這也不是沒有好處--可能能迫使程序員使用復合來代替繼續.
  2. 有時候可能會導致與其他的static方法混淆.這個缺點可以通過使用標準的命名方法來區別于其他的static方法.
  現在有兩種方法已經開始形成標準:
  valueof(type k)-返回和k有相同值的句柄.
  Getinstance-返回一個復合參數所描述的句柄.但是不一定和參數具有相同的值..這個方法在Provider framework里面是很有用的.
  
  所以,我們不要每次都毫不猶豫的使用構造方法,有時候靜態工廠方法可能是更加合適的.但是當你無法取舍的時候,還是使用構造方法吧,因為它是比較普通和標準的.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新丰县| 富源县| 竹溪县| 江华| 穆棱市| 无为县| 襄城县| 方山县| 两当县| 北辰区| 昌都县| 五台县| 盐亭县| 平遥县| 忻城县| 长兴县| 曲松县| 湛江市| 洞口县| 开化县| 凭祥市| 衡水市| 大洼县| 瓦房店市| 江安县| 彩票| 迁安市| 沿河| 广宁县| 铜山县| 华坪县| 江阴市| 海南省| 灌云县| 临猗县| 保山市| 墨江| 彩票| 六枝特区| 巴里| 宜黄县|