的需要我新的設計模式。在經歷GOF時,實現工廠模式的一種方式是創建與每種產品相對應的創建者(工廠)的並行層次結構。爲什麼我們需要這個層次結構?它不會創建不必要的子類嗎? 有人可以給我一個例子,我們需要這種實現。工廠方法:造物主層次
回答
,如果你不想讓你想在你使用它們的上下文來創造什麼反對你的決定,但希望推遲它,你需要這種模式。您可以使用工廠模式推遲對運行時的決定。
下面是一個例子(有點過於簡單,但我希望你明白了吧):
你想寫創造NumberObject
個程序,你想有兩種簡單的那種人,或者是一個複雜的。但是你不想硬編碼決定在你的程序中使用哪種數字對象,但是要根據你的程序的命令行參數來決定。
首先,創建2班SimpleNumberObject
和ComplexNumberObject
,既實現有一個抽象方法print()
並迫使子類來實現它的類NumberObject
。喜歡的東西:
public class NumberObject {
protected int number;
public NumberObject(int number) {
this.number = number;
}
abstract void print();
}
public class SimpleNumberObject extends NumberObject {
public SimpleNumberObject(int number) {
super(number);
}
public void print() {
System.out.println("My number is " + number);
}
}
public class ComplexNumberObject() extends NumberObject {
public SimpleNumberObject(int number) {
super(number);
}
public void print() {
System.out.println("My number is " + number
+ " and I can do a lot more complex stuff");
}
}
然後創建抽象類NumberFactory
,該方法createNumber()
和子類SimpleNumberFactory
和ComplexNumberFactory
,有實現這個方法,他們返回各自NumberObject:SimpleNumberFactory
一個SimpleNumberObject
和ComplexNumberFactory
一ComplexNumberObject
。然後,你設計你的主類,如果你想在構造函數中使用它,如果它將要使用的話SimpleNumberObject
或ComplexNumberObject
。
public class MainClass {
private NumberFactory numberFactory;
public MainClass(String arg) {
if (arg != null && arg.equals("complex") {
numberFactory = new ComplexNumberFactory();
} else {
numberFactory = new SimpleNumberFactory();
}
}
public void printSomeNumber() {
NumberObject number = numberFactory.createNumber();
number.print();
}
public static void main(String[] args) {
MainClass mainClass = new MainClass(args[0]);
mainClass.printSomeNumber();
}
}
這裏那麼,什麼情況是,根據命令行參數是什麼,它會創建要麼SimpleNumberObjects或ComplexNumberObjects。您沒有在代碼中指定它,因此編譯器無法知道將使用哪個對象,只是它實現NumberObject
。
有了工廠,你是從MainClass
給予責任客場如何創建一個數字。他們可能使用一個隨機生成器來產生NumberObject構造函數需要的整數,或者一些迭代數。事實是,主類不需要關心,而且你將它分離了一下。
關於決定要創建什麼對象的推遲:它並不一定是命令行參數,但可以是不同的類,一些背景信息,或別的東西。基本上,如果您想在其他地方做出決定,則使用此模式,當然如果您想將對象的創建委託給工廠。
你是正確的,有很多子類的事情,這使得這個圖案種類類重的。在實踐中,你必須決定是否付費使用它。如果您打算使用工廠來創建對象,那麼無論如何您都有不同的對象子類,對於您而言,您並不決定要在程序的某個特定位置創建哪個子類,那麼您可以考慮使用它。
- 1. 每個層次的工廠方法
- 2. 構造函數vs方法vs工廠
- 3. 無單String構造/工廠方法
- 4. 如何調用造物主方法的
- 5. 工廠方法只有一次
- 6. 工廠方法VS工廠對象
- 7. 靜態工廠方法vs工廠
- 8. 在工廠方法
- 9. Java工廠方法
- 10. 工廠方法implementaion
- 11. 工廠方法D.P
- 12. 客戶端VS在工廠方法和抽象工廠模式的創造者
- 13. 在方法層次
- 14. 沒有匹配的工廠方法發現:工廠方法 'aspectOf()'
- 15. 從子類工廠方法PHP調用超類工廠方法
- 16. 組合造物主?
- 17. 飛鏢工廠(構造函數)與靜態方法;例如,爲什麼int.parse()不是工廠構造函數?
- 18. AutoMapper靜態工廠方法
- 19. 調用Javascript工廠方法
- 20. 工廠方法在Python
- 21. 靜態工廠方法(Spring)
- 22. 靜態工廠方法
- 23. Angularjs工廠方法實現
- 24. AngularJS工廠 - 從方法
- 25. 工廠方法實施
- 26. 工廠類與FromObject()方法
- 27. 調用工廠方法
- 28. 通用工廠方法
- 29. Spring註解工廠方法
- 30. $ rootScope和工廠方法