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

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

公有構(gòu)造器的方式的缺點

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

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

  • 靜態(tài)構(gòu)造方法與構(gòu)造器不同在于,它們可以有別名。

解釋:
由于構(gòu)造函數(shù)不能修改函數(shù)名稱,然而函數(shù)的名稱是對于該函數(shù)行為最好的描述,不能修改名稱限制了代碼的可閱讀性。同時如果一個類有需要有兩個相同參數(shù)的構(gòu)造函數(shù),則只能通過改變參數(shù)的順序來達(dá)到目的。我們通過靜態(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去調(diào)用構(gòu)造函數(shù)很容易理解,必然產(chǎn)生一個新的對象。
使用靜態(tài)構(gòu)造方法即可控制每次都返回相同的對象。

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

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

解釋:
優(yōu)勢1.可以隱藏內(nèi)部實現(xiàn),顯得相對智能。
例如:java.util.EnumSet
這個類沒有public的構(gòu)造函數(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)建帶有泛型的實例時可以更簡便
    直接上例子:
    復(fù)雜版
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)代理類是用于實例化的,而構(gòu)造函數(shù)會有明確的標(biāo)識
    2.由于使用了靜態(tài)工廠方法來實例化,我們會將類的構(gòu)造函數(shù)私有化,從而導(dǎo)致該類無法被繼承。但也不完全是缺點,畢竟組合比繼承耦合度更低。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容