【发布时间】:2013-10-03 06:58:24
【问题描述】:
为了在 java 中设计 API,我想出了以下模式来满足此处列出的某些要求
- 实际的公共 API 类应作为最终类实现,以防止继承和可能的误用
- 实际的公共 API 类不应公开任何超出所需方法的内容。
- 将 API 类和内部实现分离到不同的包中
- 公共类和内部类的可扩展性或演变范围
示例代码如下:
package external;
import internal.AbstractProduct;
public final class Product extends AbstractProduct{
protected Product(int a, int b){
super(a,b);
}
@Override
public int result(){
return super.result();
}
}
public class ProductFactory {
public static Product createProudct(int a, int b){
return new Product(a, b);
}
}
和内部类如下:
package internal;
public abstract class AbstractProduct {
private final AbstractProduct impl;
protected AbstractProduct(int a, int b){
impl = new ProductImpl(a, b);
}
protected AbstractProduct(){
impl = null;
}
protected int result(){
return impl.result();
}
}
class ProductImpl extends AbstractProduct{
private int a;
private int b;
ProductImpl(int a, int b){
this.a = a;
this.b = b;
}
@Override
protected int result(){
return a*b;
}
}
虽然它工作正常并且也有适当的访问级别,但我只有设计模式或 API 设计的初学者水平技能,所以我似乎很难发现可能的故障。那么这有什么问题吗?或者它是一些已经实践过的模式?
【问题讨论】:
-
谢谢@sᴜʀᴇsʜᴀᴛᴛᴀ,不知道“代码审查”。那么我应该删除并在CR中重新发布还是什么?
-
IMO 这个问题不应该被删除。除了基本的非灵活工厂方法模式之外,您的设计非常奇怪。为什么要将
AbstractProduct impl标记为final?看起来你想实现decorator。 -
是的,这段代码有很多缺陷。如果您在此处发布您要解决的问题或您要通过此练习完成什么以获得更好的指导,那就更好了。
-
@LuiggiMendoza final 与
impl并不是真正必要的。请查看我在此答案上发布的评论stackoverflow.com/a/19043032/1443529,其中我解释了我在此设计背后的思考过程。
标签: java oop design-patterns api-design