我有一個API,它有一些基本實現。我有一家工廠向客戶提供該API的實例。不依賴於實現的工廠
我想改變我的工廠,使其更通用,因此,如果將生成api的新實現並將其jar文件放入classpath中,工廠將理解它,並且不需要任何更改。
我有一個API,它有一些基本實現。我有一家工廠向客戶提供該API的實例。不依賴於實現的工廠
我想改變我的工廠,使其更通用,因此,如果將生成api的新實現並將其jar文件放入classpath中,工廠將理解它,並且不需要任何更改。
使用java SPI,服務提供者接口。
META-INF/services/my.package.MyInterface
中列出了一個實現類(es)。服務發現發生了ServiceLoader<T>
:
public static void main(String[] args) {
ServiceLoader<MyInterface> loader = ServiceLoader.load(MyInterface.class);
for (MyInterface api : loader) {
api. ...
}
// Or take the first implementation:
MyInterface api = loader.iterator().next();
}
你可以提供的API罐子一類與該發現機制的靜態函數。
優點:
例
my.package.impl.MyImpl1
public class MyImpl1 implements MyInterface { ... }
很好的答案。 https://docs.oracle.com/javase/tutorial/ext/basics/spi.html – kervin
我們在哪裏放置實現類的列表? –
如果你想從理論開始。請閱讀約Dependency inversion principle。
在面向對象編程中,依賴性反轉原理是指特定形式的解耦軟件模塊。當遵循這一原則時,從高級別策略設置模塊到低級別依賴模塊建立的常規依賴關係被反轉(即反轉),從而使得高級別模塊獨立於低級別模塊實現細節。
答:高級模塊不應該依賴於低級模塊。兩者都應該依賴於抽象。
B.抽象不應該取決於細節。細節應該取決於抽象。
該原理顛倒了一些人可能會考慮面向對象設計的方式,即規定高級和低級對象都必須依賴於相同的抽象。
依賴注入圖書館
至於具體實現,你有很多在Java中。具體爲Dependency Injection方法。顯然想到了Spring Framework。但是你也可以看看Java EE Context and Dependency Injection。
接口注入
您還可以...
@kevin我對這個概念非常熟悉,但是在您提供的示例中,客戶端在編譯時綁定了impl,但在我的情況下,客戶端和工廠直到運行時才知道impl。 這是一些像slf4j方法與其impls。 –
@ Ali.Valizadeh在這兩種情況下,客戶和實施都不需要知道對方。正如維基百科鏈接所解釋的,他們需要一個共享的接口或基類。例如。 「IJob」或「JobBase」類。但是這可能是非常通用的。 – kervin
但有些東西應該爲客戶端提供該接口的實例(在這種情況下是工廠)是否錯誤? –
看起來像'Reflection'工作。 – CKing