用靜態工廠方法代替構造器以及服務提供者框架

2022-03-20 09:51:09 字數 1902 閱讀 8100

優點:

可以確切描述返回什麼物件,避免構造不規範

可以不必在每次呼叫時都建立新的物件

它可以返回該類的子類物件,程式更加靈活

返回的物件可以根據指定引數生成,引數不同,物件就不同

返回物件所屬的類,可以與該類無關

例項化物件時,不要第一反應就是提供公有構造器,而不先考慮靜態工廠方法

概念都是不好理解的,通過例項來理解概念

參考自知乎使用者,uncle-lv

假如一所大學有三個學院,資訊學院,財經學院,工程學院,我們不想把建立學院交給外部,因為外部不了解該大學的結構,

可能創造乙個不存在的學院,但是,我們又要提供建立學院的介面,這時候該怎麼做?

這時候靜態工廠方法就起作用了,類提供乙個公有的靜態工廠方法

【優點1】:使用靜態工廠模式確定要返回什麼物件,避免構造不規範

public class college

//提供3種建立方法

public static college getinfomationcollege()

public static college getfinancecollege()

public static college getengineercollege()

public string getname()

}

【優點2】:可以不必在每次呼叫時都建立新的物件

//有時候我需要多次呼叫靜態方法得到該物件,但是學院只要建立乙個,我們先呼叫一下

college college1 = college.getengineercollege();

college college2 = college.getengineercollege();

system.out.println(college1 == college2); //false

//很明顯,生成了兩個學院,這不符合我們的需求,所以第一段**,還有改進的空間

private static college infomationcollege;

public static college getinfomationcollege()

return college.infomationcollege;

}//再來測試一下

college college1 = college.getengineercollege();

college college2 = college.getengineercollege();

system.out.println(college1 == college2); //true

有乙個人的類,我們通過靜態工廠方法生成其子類

【優點3】: 它可以返回該類的子類物件,程式更加靈活

這樣我們返回的都是person的子類物件,我們不必知道adult類和child類的存在,程式更加靈活

【優點4】:所放回的物件的類何以隨著每次呼叫而發生變化,這取決於靜態工廠方法的引數值

每次返回的型別因引數的都不同

public class person 

if(age > 18)

return null;

}private static class child extends person

}//成員內部類

private static class adult extends person

}}

【優點5】:

1、什麼時候使用靜態工廠方法?

2、缺點

靜態工廠方法代替構造器

靜態工廠方法的優勢 1它們有名稱,表意更清楚。2不必在每次呼叫它們的時候都建立乙個新物件 3它們可以返回原返回型別的任何子型別的物件。4在建立引數化型別例項的時候,它們是 變得更加簡單。缺點 1類如果不含有公有的或者受保護的構造器,就不能被子類化 2它們與其他的靜態方法實際上沒有任何區別,不方便辨認...

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

1.考慮用靜態工廠方法代替構造器 例子 public static boolean valueof boolean b 使用靜態工廠替代構造器的優勢 1 他們有名稱 2 不必每次呼叫都產生新的物件 3 可以返回原返回型別任何子型別的物件 4 建立引數化型別例項的時候,使 更簡潔 缺點 1 類如果不含...

No1 用靜態工廠方法代替構造器

先來看乙個例子 下面這個方法將boolean基本型別值轉換成了乙個boolean物件引用 public static boolean valueof boolean b 如果不通過共有的構造器,或者說除了公有的構造器之外,類還可以給他它的客戶端提供靜態工廠方法。提供靜態工廠方法而不是公有的構造器,這...