- 類和方法類的情況下,一個很好的做法:
如果我們使用工廠方法,我們將不得不返回創建作爲實現的接口的類型實現。這是使用「默認」 Java訪問隱藏從客戶端
public class Factory {
public Product getProduct() {
return new ProductA();
}
}
public interface Product {
}
class ProductA implements Product {
}
爲了避免客戶的投退還的產品來具體實現產品{A,B,C ...等},我們有能力:
- 將客戶端和工廠代碼分開包裝(比如說
com.example.client
和com.example.factory
) - 聲明混凝土implemantations使用默認( 「包」)的訪問(可見於工廠,而不是客戶端可見)
package com.example.client;
...
public class Client {
public static void main(String[] args) {
Product i = new Factory().getProduct();
ProductA a = (ProductA) i; // the type of ProductA isn't visible.
}
}
- 在方法的情況下:
例如我們需要使用與隱藏方法相同的工廠
public class Factory {
public Product getProduct() {
return new ProductA();
}
Product[] getCreatedProducts() {
...
}
}
我在這裏看到了兩個問題:
- 壞包結構:隱藏的類和方法必須是在一個封裝與調用代碼。
- 錯誤代碼:不那麼直觀和易於理解。將java文件替換爲另一個包很容易。
我還以爲是一樣的'protected',但我不知道。我總是定義一個訪問關鍵字。 –
@Martijn'protected'對包和子類是可訪問的。默認(無關鍵字)可以打包訪問,但不能訪問子類。 – toto2
@Agasteted我認爲你做對了。但我不明白你的「兩個問題」。另外我不太清楚爲什麼你這樣做:爲什麼要隱藏來自客戶端的不同'Product'類型? – toto2