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的实例)。
我做错什么了?
问候
发布于 2017-11-17 19:37:28
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()成语将通过创建许多工厂实例来结束。
工厂可能创建多个对象实例,但为什么需要多个工厂实例?
一个人可以创建所有你需要的对象。
因此,您应该有一个工厂的单例实例。
要实现这一点,您可以使用单例DP或依赖项注入(这更好)。
依赖注入需要一个DI框架。
你似乎没有使用它。
作为解决办法,在普通java中,您可以实现一个热切的Singleton (感谢Bill ),例如:
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();发布于 2017-11-17 20:07:07
好吧,我就是这样做的:
文件IDataSources.java
package pl.weatherPrediction.interfaces;
public interface IDataSources {
//void getFiles(String url, String folder, String timeStamp);
}文件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();
}
}对吗?@davidxxx?
发布于 2017-11-17 19:42:32
你需要那个物体
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();这是真正的工厂级
https://stackoverflow.com/questions/47358020
复制相似问题