麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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里面是很有用的.
  
  所以,我們不要每次都毫不猶豫的使用構造方法,有時候靜態工廠方法可能是更加合適的.但是當你無法取舍的時候,還是使用構造方法吧,因為它是比較普通和標準的.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 色中色在线播放 | 久久国产一二三 | 亚洲免费看片网站 | 国产激情精品一区二区三区 | 国产精品一区二区三区在线 | 99精品国产一区二区三区 | 欧美人与牲禽动交精品一区 | 羞羞视频在线免费 | 羞羞视频2023 | 精品国产一区二区三区四区阿崩 | 久久久一区二区精品 | 国产成人精品无人区一区 | 请播放一级毛片 | 国产资源视频在线观看 | 日韩黄色免费电影 | 一级黄色毛片a | 欧美一级精品 | 最新欧美精品一区二区三区 | 俄罗斯hdxxx| 成人在线免费观看小视频 | 国产精品午夜性视频 | 韩国精品视频在线观看 | 亚洲成人涩涩 | 久草视频手机在线观看 | 九九热视频免费 | 在线免费亚洲 | 粉嫩粉嫩一区二区三区在线播放 | 精品久久久久久久久久久久久久久久久久久 | 国产一区网址 | 特黄一级小说 | 成人毛片100部免费观看 | 久久毛片免费观看 | 99re色| 国产一级aa大片毛片 | 高清一区二区在线观看 | 精国品产一区二区三区有限公司 | 久久最新网址 | 舌头伸进添的我好爽高潮网站 | 日韩欧美中文字幕视频 | 天天夜碰日日摸日日澡性色av | 成人三级电影在线 |