我有一個工廠類CipherBuilder
,其靜態方法build
返回StringCipher
對象到客戶端。 我想隱藏StringCipher
類,所以客戶端只能通過CipherBuilder
工廠得到這種類型的對象,並且不能直接調用類構造函數(但它仍然可以使用它的公有方法)。以工廠模式隱藏客戶端的產品
我當前的實現是創建另一個包從客戶端代碼分開,並把其中的三個班,CipherBuilder
工廠(這是公開的),在StringCipher
(包私人)和公共的接口吧(IStringCipher
)。這樣客戶端不能直接調用構造函數,但它仍然可以通過接口使用公共方法。
但是因爲我不得不創建一個新的包來隱藏一個類,這就像一個黑客。有沒有更好的方式來執行此操作(使用Java),同時將StringCipher保留在與客戶端代碼相同的包中,並將StringCipher
和CipherBuilder
保存在單獨的文件中?
讓CipherBuilder創建一個IStringCipher。並且StringCipher以某種方式被隱藏。它確實意味着一個包私人類和構造函數。子包也是慣例。人們可以使該類成爲工廠類的靜態內部類。 –
因此,在將StringCipher與客戶端代碼保持在同一個包中時,沒有辦法做到這一點?我可以在單獨的文件中執行靜態內部類嗎? – devil0150
另一種方法:** Java SPI,服務提供程序接口**。這是一種機制,通過該機制可以發現並加載XML解析器。至於原始問題:我不完全確定你想要指定的東西是多麼「好」。 (順便說一下,至少有一個'package'是常態。)有一個帶有私有構造函數的類(例如工廠),可以將工廠傳遞給構造函數並檢查一個非null對象。醜陋! (更好地等待Java 9與模塊。)對不起,混亂。 –