- 类和方法类的情况下,一个很好的做法:
如果我们使用工厂方法,我们将不得不返回创建作为实现的接口的类型实现。这是使用“默认” 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