哪种设计模式适用于创建继承对象?

3

我有一个继承结构,类似于这样:

public class ImageButton extends JButton {
    private Image image;

    public ImageButton(Image i) {
        this.image = i;
    }
}

public class ColorButton extends JButton {
    private Color color;

    public ColorButton(Color c) {
        this.color = c;
    }
}

所有对象都扩展了JButton。 还有更复杂的对象,它们扩展了ImageButton类等。我考虑使用抽象工厂模式,但我的问题是,每个类的构造函数采用不同的属性。
我应该使用哪个模式来实现良好的创建方式?

你可以将子类对象分配给超类。在使用子类方法时,将对象强制转换为特定类型并访问这些方法。 - ajayg2808
我正在寻找一个合适的设计模式,以便我可以使用它来创建它们,你是什么意思? - F_Schmidt
1个回答

4
你可以使用静态工厂方法来实现这一点。在这里,我可以举一个例子来作为启示,那就是guava的Lists,其中定义了许多工厂方法,包括但不限于:

  • newArrayList(E... elements)(指定元素的数组列表)
  • newArrayListWithCapacity(int initialArraySize)(具有容量的空数组列表)
  • newLinkedList()(空链表)
  • ...

这是基于您想要简化按钮对象创建的理解,而我认为静态工厂方法非常适合。

您自己的代码可以包括这样的方法(在同一类中,甚至是接口):

public static JButton imageButton(Image i) {
    return new ImageButton(i);
}
public static JButton colorButton(Color color) {
    return new ColorButton(color);
}
public static JButton greenButton() {
    return new ColorButton(Color.GREEN);
}

我已经想到了这个解决方案,但我也认为可能存在一些不同的模式,因为所有对象都是扩展JButton。我猜我正在创建一个静态工厂。谢谢! - F_Schmidt
@F_Schmidt 我注意到我认为您需要简化创建按钮所需的代码。如果是这种情况,那么这种静态工厂在我看来可以很好地工作。如果您的目标是从调用者中挑选精确的按钮实现的责任,则此实现不太适用。 - ernest_k
1
我想要隐藏类,因此在创建任何类型的按钮时希望使用简单的调用。我不想使用像 ColorButton c = new ColorButton(...) 或者 ColorTextButton ct = new ColorTextButton("...", ...); 这样的调用方式。但是,像 ButtonFactory.create(...) 或者 createColorButton(...) 这样的调用方式在我看来更加整洁。 - F_Schmidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接