2017-06-22 60 views
1

(我使用C#在我的例子,但這個問題沒有具體關於C#)讓兩家工廠返回實現兩個接口相同的對象

我們工廠創建多個接口的對象,每個接口一個工廠。

假設我們有一個PrintingFactory來創建實現IPrintingScanningFactory的對象IScanning。我們有實施IPrinting的混凝土打印機和實施IScanning的混凝土掃描儀,工廠決定選擇哪種實施。

ScanningFactory我:

public static IScanning Build() 
{ 
    ... 
    return new CanonXYZ2000(); 
} 

我在PrintingFactory類似的代碼,並在main我:

scanner = ScanningFactory.Build(); 
printer = PrintingFactory.Build(); 

現在,如果我想要實例化一個對象會發生什麼實現兩個接口?

public class CanonXYZ2001MultiPurpose: IPrinting, IScanning {...} 

我想兩個工廠都返回相同的對象。我如何正確地做到這一點?

回答

0

如果我正確地理解了你,你問是否可以通過ScanningFactory和PrintingFactory創建CanonXYZ2001MultiPurpose?

在這種情況下,兩個工廠可以返回CanonXYZ2001MultiPurpose的情況下沒有問題,因爲這個類實現兩個接口:

掃描工廠代碼:

public static IScanning Build() 
{ 
    ... 
    return new CanonXYZ2001MultiPurpose(); 
} 

印刷廠代碼:

public static IPrinting Build() 
{ 
    ... 
    return new CanonXYZ2001MultiPurpose(); 
} 

這兩個變量現在都包含CanonXYZ2001MultiPurpose的實例:

var scanner = ScanningFactory.Build(); 
var printer = PrintingFactory.Build(); 
+0

這就是我所擁有的,它創造了兩個對象,我只需要一個。一個通過掃描工廠實例化並作爲掃描儀返回,然後另一個通過打印工廠實例化並作爲打印機返回。 在工廠裏,我知道在什麼情況下我們創建了一個多用途機器,只是這兩個工廠需要一些機制來訪問另一個可能已經實例化的對象。我想在這個黑暗中保留'main','main'只想掃描和打印,它不關心細節。 –

+0

在這種情況下,您可以使用單個工廠,它接受所需的類型並返回適當的實例。在內部它可以保存每種類型的特定工廠列表。你也需要跟蹤你已經創建的所有實例。 當Build(Type t)被調用時,你可以檢查你是否已經有了符合你的需求的實例(例如實現IPrinting和IScanning)。如果你有這樣的實例 - 你可以返回它,否則你只需調用合適的工廠以獲得特定的類型,在內部存儲這個實例並將它返回給主叫方。 –