gpt4 book ai didi

java - Java 中的抽象工厂 - 如何扩展?

转载 作者:行者123 更新时间:2023-11-30 11:52:37 24 4
gpt4 key购买 nike

我使用 java 库 coreAbstractFactory 负责 UI 组件。 MyApplication 使用核心并自定义 UI。因此,在启动 MyApplication 期间,我将 MyFactory 设置为 AbstractFactory 的一个实例。

class AbstractFactory {
...
public static AbstractFactory getInstance();
public abstract JButon createButton();
public abstract JLabel createLabel();
...
}

class MyFactory extends AbstractFactory {
...
}

MyApplication.startup() {
AbstractFactory.setInstance(new MyFactory())
}

我的问题是,我需要在 MyApplication 中创建 JList,但我无法在 AbstractFactory 中添加 public JList createJList(),因为我无法修改核心库。

我该怎么办?

案例一:始终在 MyApplication 新静态字段中调用 MyFactory.getMyFactoryInstance()

class MyFactory extends AbstractFactory {
private static MyFactory myInstance = new MyFactory();
public static getMyFactoryInstance() { return myInstance }
...
}

案例二:始终在 MyApplication 中调用 MyFactory.getMyFactoryInstance(),使用 cast

class MyFactory extends AbstractFactory {
public static MyFactory getMyFactoryInstance() {
if (getInstance() instanceOf MyFactory) {
return (MyFactory) getInstance();
}
throw Exception();
}
...
}

案例三:使用两个工厂。对于 JButtons 和 JLabels,使用 AbstractFactory,对于 JList 使用 SomeOtherFactory。

JButton button = AbstractFactory.getInstance().createButton();
JList list = SomeOtherFactory.getInstance.createList();

案例四:有更好的吗?我觉得我忽略了一些东西。

最佳答案

我将创建一个 AbstractFactory 的抽象子类,它指定 createJList() 方法并覆盖返回新的 getInstance() 方法抽象类类型。然后,您可以在 MyFactory 类中实现逻辑,并遵守针对接口(interface)(在本例中为抽象)而非实现编程的原则!

示例代码:

public abstract class MyAbstractFactory extends AbstractFactory {
//you could implement AbstractFactory's abstract methods here

public abstract JList createJList();
}

public class MyFactory extends MyAbstractFactory {
private static MyAbstractFactory instance;

private MyFactory() {}

public JList createJList() {
//implementation of method here
}
public static MyAbstractFactory getInstance() {
if (instance == null) instance = new MyFactory();
return instance;
}
}

上面的例子使用了lazy instantiation,如果代码并不总是被使用并且不在多线程应用程序中使用,这很好。但是,如果以多线程方式使用它,我将使用 MyFactory 的以下实现,它使用双重检查锁定 来处理多个线程。

public class MyFactory extends MyAbstractFactory {
private volatile static MyAbstractFactory instance;

private MyFactory() {}

public JList createJList() {
//implementation of method here
}
public static MyAbstractFactory getInstance() {
if (instance == null) {
syncronized(MyFactory.class) {
if (instance == null) instance = new MyFactory();
}
}
return instance;
}
}

无论哪种实现,用法都将保持不变。

用法:

MyAbstractFactory factory = MyFactory.getInstance();
factory.createJList();

关于java - Java 中的抽象工厂 - 如何扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6759485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com