2013-03-17 58 views
1

的需要我新的設計模式。在經歷GOF時,實現工廠模式的一種方式是創建與每種產品相對應的創建者(工廠)的並行層次結構。爲什麼我們需要這個層次結構?它不會創建不必要的子類嗎? 有人可以給我一個例子,我們需要這種實現。工廠方法:造物主層次

回答

1

,如果你不想讓你想在你使用它們的上下文來創造什麼反對你的決定,但希望推遲它,你需要這種模式。您可以使用工廠模式推遲對運行時的決定。

下面是一個例子(有點過於簡單,但我希望你明白了吧):

你想寫創造NumberObject個程序,你想有兩種簡單的那種人,或者是一個複雜的。但是你不想硬編碼決定在你的程序中使用哪種數字對象,但是要根據你的程序的命令行參數來決定。

首先,創建2班SimpleNumberObjectComplexNumberObject,既實現有一個抽象方法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()和子類SimpleNumberFactoryComplexNumberFactory,有實現這個方法,他們返回各自NumberObject:SimpleNumberFactory一個SimpleNumberObjectComplexNumberFactoryComplexNumberObject。然後,你設計你的主類,如果你想在構造函數中使用它,如果它將要使用的話SimpleNumberObjectComplexNumberObject

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構造函數需要的整數,或者一些迭代數。事實是,主類不需要關心,而且你將它分離了一下。

關於決定要創建什麼對象的推遲:它並不一定是命令行參數,但可以是不同的類,一些背景信息,或別的東西。基本上,如果您想在其他地方做出決定,則使用此模式,當然如果您想將對象的創建委託給工廠。

你是正確的,有很多子類的事情,這使得這個圖案種類類重的。在實踐中,你必須決定是否付費使用它。如果您打算使用工廠來創建對象,那麼無論如何您都有不同的對象子類,對於您而言,您並不決定要在程序的某個特定位置創建哪個子類,那麼您可以考慮使用它。