2009-08-20 35 views
1
class XFactory { 

    private XFactory() {} 

    static void getX() { 
    if(...) 
     return new A(new XFactory()); 
    else 
     return new B(new XFactory()); 
    } 

} 

class A { 
    private A() {} 
    public A(XFactory xf) {} 
} 

class B { 
    private B() {} 
    public A(XFactory xf) {} 
} 

通過這種方式,我可以確保只有工廠可以創建它的屬於類的實例。確保只有工廠可以創建實例

這是正確的方法還是有任何其他的替代/好方法?

回答

2

常見的方法(在C++中)是使「所屬類」構造函數爲私有,並讓它們聲明工廠類爲friend

1

我會讓XFactory的類A和類B的朋友,並保持所有的構造函數私有。因此,只有XFactory可以訪問它們的構造函數。

也就是說,在C++中。在Java或C#中,我沒有看到任何在編譯時強制執行的乾淨方式。你的例子遠非萬無一失,甚至有點混亂,因爲只要有一個XFactory的實例,他可以將它傳遞給A或B的構造函數,並直接實例化它們。

+0

沒有人可以創建XFactory的實例。 bcoz它的構造函數是私有的。 – Prabu 2009-08-20 03:43:50

1

如果您正在爲冠軍而黑客和不能使你的構造函數私有,你可以: 讓你的工廠的全球獨立的,並創建一個對象:

  • 創建一個隨機密鑰
  • 添加該鍵到工廠對象中的私鑰列表
  • 將密鑰傳遞給構造函數
  • 讓構造函數檢索全局工廠對象並調用它來驗證密鑰。
  • 如果他們的密鑰驗證失敗,請解決您的程序(調用退出,死亡,......任何合適的)。或者可能通過電子郵件發送給管理員。這是應該迅速發現的事情。

(我能得到劈分?) 雅各

-1

在Java中,你可以使構造私人和提供工廠在一個公共嵌套類的形式,因爲嵌套類訪問私有成員他們宣佈的階級。

public class ExampleClass { 

    private ExampleClass() { 

    } 

    public class NestedFactory { 
     public ExampleClass createExample() { 
      return new ExampleClass(); 
    } 
} 

任何想要創建ExampleClass.NestedFactory實例並通過它實例化ExampleClasses的人。

我一直無法找到一種方法來做到這一點,讓您從ExampleClass繼承,因爲Java編譯器要求您指定超類的構造函數......所以這是一個缺點。

相關問題