Java-工厂,实例


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的实例)。

我做错了什么?

问候

SYNOPFactoryWRFFactory被声明为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();

但这不会像现在WRFWRFFactory类是私有的:

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();

这是一个真正的工厂级

最新更新