考慮用靜態(tài)工廠方法代替構造器

所謂構造器即構造函數(shù)

公有構造器的方式的缺點

  • 只能通過new className() 的方式來實現(xiàn)
  • 每次調用必然返回一個新的對象
  • 返回類型就是該類

靜態(tài)工廠方法優(yōu)點:

  • 靜態(tài)構造方法與構造器不同在于听怕,它們可以有別名唇跨。

解釋:
由于構造函數(shù)不能修改函數(shù)名稱获三,然而函數(shù)的名稱是對于該函數(shù)行為最好的描述,不能修改名稱限制了代碼的可閱讀性险毁。同時如果一個類有需要有兩個相同參數(shù)的構造函數(shù)霍衫,則只能通過改變參數(shù)的順序來達到目的候引。我們通過靜態(tài)工廠方法都可以解決以上問題。
例如:

public class People {
    private String name;
    private Integer age;
    private String sex;
    public People(String name,Integer age){
        this.name = name;
        this.age = age;
        sex = "男";
    }
    public People(Integer age,String name){
        this.name = name;
        this.age = age;
        sex = "女";
    }
}
public class Test {
    public static void main(String[] args) {
        //問題很明顯 得通過記住參數(shù)的順序才可以返回正確的people
        People man = new People("李雷",20);
        People woman = new People(20,"韓梅梅");
    }
}
public class People {
    private String name;
    private Integer age;
    private String sex;
    private People(String name,Integer age,String sex){
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public static People getMan(String name,Integer age){
        People man = new People(name,age,"男");
        return man;
    }
    public static People getWoman(String name,Integer age){
        People woman = new People(name,age,"女");
        return woman;
    }
}
public class Test {
    public static void main(String[] args) {
        People man =  People.getMan("李雷",20);
        People woman = People.getWoman("韓梅梅",20);
    }
}
  • 第二大優(yōu)勢在于不必每次創(chuàng)建一個新的對象

解釋:
每次使用new去調用構造函數(shù)很容易理解敦跌,必然產生一個新的對象澄干。
使用靜態(tài)構造方法即可控制每次都返回相同的對象。

public class Singleton {
    private static Singleton singleton = new Singleton();
    private Singleton(){

    }
    public static Singleton getSingleton(){
        return singleton;
    }
}
  • 第三大優(yōu)勢在于可以返回原返回類型的任何子類型的對象

解釋:
優(yōu)勢1.可以隱藏內部實現(xiàn)柠傍,顯得相對智能麸俘。
例如:java.util.EnumSet
這個類沒有public的構造函數(shù),只有靜態(tài)工廠方法惧笛,根據(jù)元素個數(shù)的多少返回不同的子類从媚。對于客戶端,這個是不可見的

public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        Enum<?>[] universe = getUniverse(elementType);
        if (universe == null)
            throw new ClassCastException(elementType + " not an enum");

        if (universe.length <= 64)
            //對于數(shù)量小有性能優(yōu)勢
            return new RegularEnumSet<>(elementType, universe);
        else
            return new JumboEnumSet<>(elementType, universe);
    }

優(yōu)勢2.根據(jù)傳入?yún)?shù)不同返回不同的子類實例
例如傳入案件類別 返回不同的子類案件的實例

  • 第四大優(yōu)勢在于患整,創(chuàng)建帶有泛型的實例時可以更簡便
    直接上例子:
    復雜版
Map<String,List<String>> map = new HashMap<String,List<String>>();

簡單版

//如果我們提供一個靜態(tài)工廠類
public static <K,V> HashMap<K,V> newInstance(){
  return new HashMap<K,V>();
}
Map<String,List<String>> map = HashMap.newInstance();

缺點:

  1. api中沒有不會明確的說明靜態(tài)代理類是用于實例化的拜效,而構造函數(shù)會有明確的標識
    2.由于使用了靜態(tài)工廠方法來實例化,我們會將類的構造函數(shù)私有化各谚,從而導致該類無法被繼承紧憾。但也不完全是缺點,畢竟組合比繼承耦合度更低昌渤。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末赴穗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌般眉,老刑警劉巖加矛,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異煤篙,居然都是意外死亡斟览,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門辑奈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苛茂,“玉大人,你說我怎么就攤上這事鸠窗〖搜颍” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵稍计,是天一觀的道長躁绸。 經(jīng)常有香客問我,道長臣嚣,這世上最難降的妖魔是什么净刮? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮硅则,結果婚禮上淹父,老公的妹妹穿的比我還像新娘。我一直安慰自己怎虫,他們只是感情好暑认,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著大审,像睡著了一般蘸际。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上徒扶,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天粮彤,我揣著相機與錄音,去河邊找鬼酷愧。 笑死驾诈,一個胖子當著我的面吹牛缠诅,可吹牛的內容都是我干的溶浴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼管引,長吁一口氣:“原來是場噩夢啊……” “哼士败!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谅将,失蹤者是張志新(化名)和其女友劉穎漾狼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饥臂,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡逊躁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了隅熙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片稽煤。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖囚戚,靈堂內的尸體忽然破棺而出酵熙,到底是詐尸還是另有隱情,我是刑警寧澤驰坊,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布匾二,位于F島的核電站,受9級特大地震影響拳芙,放射性物質發(fā)生泄漏察藐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一舟扎、第九天 我趴在偏房一處隱蔽的房頂上張望转培。 院中可真熱鬧,春花似錦浆竭、人聲如沸浸须。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽删窒。三九已至,卻和暖如春顺囊,著一層夾襖步出監(jiān)牢的瞬間肌索,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工特碳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诚亚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓午乓,卻偏偏與公主長得像站宗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子益愈,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內容