[英]instance factory methods Vs Static factory methods
不是所有的工廠方法都是靜態的嗎? 產生產品的東西需要狀態嗎? 何時適合實例工廠或靜態工廠方法? 你能舉例說明兩者的區別嗎?
假設通過“實例工廠方法”你實際上是在談論GoF“工廠方法”,Joshua Bloch在他的書“Effective Java”中描述了術語“靜態工廠方法”。 谷歌搜索我到達這些網站:
希望它有助於使差異更加清晰。
遵循Marvo的建議:
定義用於創建對象的接口,但讓子類決定實例化哪個類。 Factory Method允許類將實例化延遲到子類。
示例(Java代碼):
public abstract class Product { ... }
public class ConcreteProduct extends Product { ... }
public abstract class Creator {
public void anOperation() { ... product = factoryMethod(); ... }
public abstract Product factoryMethod();
}
public class ConcreteCreator extends Creator {
public Product factoryMethod() { return new ConcreteProduct(); }
}
類可以提供公共靜態工廠方法,它只是一個返回類實例的靜態方法。 (...)靜態工廠方法的一個優點是,與構造函數不同,它們具有名稱。 (...)靜態工廠方法的第二個優點是,與構造函數不同,它們不需要在每次調用時創建新對象。 (...)靜態工廠方法的第三個優點是,與構造函數不同,它們可以返回其返回類型的任何子類型的對象。 (...)僅提供靜態工廠方法的主要缺點是沒有公共或受保護構造函數的類不能被子類化。
示例(Java代碼):
public class Boolean {
...
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
...
}
我目前的偏好是為了更容易測試,使工廠方法不是靜態的。 您無法在運行時更改靜態工廠方法調用,而如果我可以為對象提供工廠實現,那么我可以更徹底地測試它,因為我可以更好地控制上下文和對象圖。
如果您從工廠返回一個Singleton,那么您將需要確保只有一個實例,如果您要在每次調用工廠時創建一個新實例,然后將其設置為靜態。
這取決於,例如,您可以擁有一個只生產一定數量對象的工廠,在這種情況下會有一個相關的狀態。 在大多數情況下,工廠方法可以是靜態的,只要它們不依賴於任何非靜態變量(例如非靜態全局變量等)來創建它們。 它還傾向於區分不同工廠的不同部分應用程序,因此根據工廠中是否存在狀態,您可能會認為所有工廠方法都應該是靜態的,請查看哪些情況適用於你並適當地寫出來。
另一個考慮因素是static關鍵字,這會導致靜態內容只在內存中實例化一次,但缺點是它始終駐留在進程內存中(這會增加工作集大小)。 這可能是你不想要的東西,因為你的工廠在某些區域可能具有非常高的位置,否則它只會在其他地方使用內存,但這通常是一個優化問題,只有在內存問題時才應該查看你的申請中出現了壓力。
如果之前需要實例,那么您可以使用靜態工廠,否則實例化工廠本身並將其傳遞給您的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.