public class DataFactory {
class SYNOP implements IDataSources {}
class WRF implements IDataSources {}
public abstract class Factory {
public abstract IDataSources CreateModel();
}
public class SYNOPFactory extends Factory {
@Override
public IDataSources CreateModel() {
return new SYNOP();
}
}
public class WRFFactory extends Factory {
@Override
public IDataSources CreateModel() {
return new WRF();
}
}
public static void main(String[] args) {
Factory factory = new WRFFactory();
}
}
我收到这样的消息错误:
无法访问DataFactory类型的封闭实例。必须符合条件具有DataFactory类型的封闭实例的分配(例如。x.new A(),其中x是DataFactory的实例)。
我做错了什么?
问候
SYNOPFactory
和WRFFactory
被声明为DataFactory
的内部类
这意味着它们的实例需要DataFactory的实例
例如,您可以将它们实例化为
Factory factory = new DataFactory().new WRFFactory();
但事实上,让他们成为内部阶级并没有什么意义
为什么需要将它们的实例与DataFactory
紧密耦合
您应该在它们自己的类文件中声明它们
并提取自己类中的其他类。否则你也会遇到同样的问题
注意,如果您想从客户端隐藏IDataSources
实现,您可以将它们的子类声明为创建它们实例的工厂子类的私有类成员:
public class SYNOPFactory extends Factory {
private class SYNOP implements IDataSources {
}
@Override
public IDataSources CreateModel() {
return new SYNOP();
}
}
public class WRFFactory extends Factory {
private class WRF implements IDataSources {
}
@Override
public IDataSources CreateModel() {
return new WRF();
}
}
通过这种方式,当你通过接口编程时,这将编译得很好:
Factory factory = new WRFFactory();
IDataSources dateSources = factory.CreateModel();
但这不会像现在WRF
对WRFFactory
类是私有的:
WRF wrf = new ...;
请注意,不需要创建一个工厂的多个实例
重复new DataFactory()
习惯用法将通过创建许多工厂实例来完成
一个工厂可能会创建多个对象实例,但为什么需要拥有一个工厂的多个实例
一个可以创建所有需要的对象
所以您应该有一个工厂的单例实例
为了实现它,您可以使用singleton DP或依赖项注入(更好)
依赖项注入需要一个DI框架
您似乎没有使用它。
作为变通方法,在纯java中,您可以实现一个热切的Singleton(感谢Bill Pugh),例如:
public class WRFFactory extends Factory {
private class WRF implements IDataSources {
}
private static WRFFactory instance = new WRFFactory();
private WRFFactory(){
}
public static WRFFactory getInstance(){
return instance;
}
@Override
public IDataSources CreateModel() {
return new WRF();
}
}
现在,您可以通过以下方式创建IDataSources
实例:
IDataSources datasources = WRFFactory.getInstance().CreateModel();
好的,所以我这样做:
文件IDataSources.java
package pl.weatherPrediction.interfaces;
public interface IDataSources {
//void getFiles(String url, String folder, String timeStamp);
}
File Factory.java
package pl.weatherPrediction.factory;
import pl.weatherPrediction.interfaces.*;
public abstract class Factory {
public abstract IDataSources CreateModel();
}
文件SYNOPFactory.java
package pl.weatherPrediction.factory;
import pl.weatherPrediction.factory.Factory;
import pl.weatherPrediction.interfaces.IDataSources;
public class SYNOPFactory extends Factory {
class SYNOP implements IDataSources {}
@Override
public IDataSources CreateModel() {
return new SYNOP();
}
}
文件WRFFactory.java
package pl.weatherPrediction.factory;
import pl.weatherPrediction.interfaces.IDataSources;
public class WRFFactory extends Factory {
class WRF implements IDataSources {}
@Override
public IDataSources CreateModel() {
return new WRF();
}
}
文件Main.java
package pl.weatherPrediction.App;
import pl.weatherPrediction.factory.*;
public class Main {
public static void main(String[] args) {
Factory factory = new SYNOPFactory();
factory.CreateModel();
factory = new WRFFactory();
factory.CreateModel();
}
}
这是正确的@davidxx吗?
您需要对象
private static DataFactory dataFactory;
你需要一个私人建设者
private DataFactory() {
}
你需要一个实例生成器
public static DataFactory getInstance() {
if (DataFactory.dataFactory == null) {
DataFactory.dataFactory = new DataFactory();
}
return DataFactory.dataFactory;
}
然后你在主中调用它
DataFactory dataFactory = DataFactory.getInstance();
这是一个真正的工厂级