我使用java库core
,AbstractFactory
负责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()
,使用强制转换
class MyFactory extends AbstractFactory {
public static MyFactory getMyFactoryInstance() {
if (getInstance() instanceOf MyFactory) {
return (MyFactory) getInstance();
}
throw Exception();
}
...
}
案例三: 使用两个工厂。对于JButtons和JLabel,使用AbstractFactory,对于JList使用SomeOtherFactory。
JButton button = AbstractFactory.getInstance().createButton();
JList list = SomeOtherFactory.getInstance.createList();
案例四:更好一点?我觉得我忽视了一些事情。
答案 0 :(得分:1)
我将创建一个AbstractFactory
的抽象子类,它指定createJList()
方法并覆盖返回新抽象类类型的getInstance()
方法。然后,您可以在MyFactory类中实现逻辑,并遵循编程到接口的原则(在本例中为抽象),而不是实现!
示例代码:
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();
答案 1 :(得分:0)
既然您需要不同的工厂来构建不同的东西,您是否考虑过使用泛型?
interface Factory<T> {
...
T create();
...
}
只需为您需要创建的每种类型的工具设置一个类型工厂。例如:
class JButtonFactory implements Factory<JButton> {
public JButton create() {
return new JButton();
}
}