Java-Factory,实例
我收到如下错误消息: 无法访问DataFactory类型的封闭实例。必须符合条件 带有DataFactory类型的封闭实例的分配(例如。 x、 新建A(),其中x是DataFactory的实例) 我做错了什么Java-Factory,实例,java,design-patterns,factory,Java,Design Patterns,Factory,我收到如下错误消息: 无法访问DataFactory类型的封闭实例。必须符合条件 带有DataFactory类型的封闭实例的分配(例如。 x、 新建A(),其中x是DataFactory的实例) 我做错了什么 将SYNOPFactory和WRFFactory声明为数据工厂的内部类 这意味着它们的实例需要DataFactory的实例。 例如,您可以将它们实例化为 public class DataFactory { class SYNOP implements IDataSources
将
SYNOPFactory
和WRFFactory
声明为数据工厂的内部类
这意味着它们的实例需要DataFactory的实例。
例如,您可以将它们实例化为
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();
}
}
但事实上,让它们成为内部类并没有真正的意义。
为什么需要将它们的实例与数据工厂
紧密耦合?
您应该在它们自己的类文件中声明它们。
并在自己的类中提取其他类。否则您也会遇到同样的问题。
请注意,如果要对客户端隐藏IDataSources
实现,可以将其子类声明为创建其实例的工厂子类的私有类成员:
Factory factory = new DataFactory().new WRFFactory();
通过这种方式,当您通过接口编程时,这将很好地编译:
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();
}
}
但这将不会发生,因为现在WRF
是WRFFactory
类的私有:
Factory factory = new WRFFactory();
IDataSources dateSources = factory.CreateModel();
还请注意,不需要创建工厂的多个实例。
重复newdatafactory()
习惯用法将通过创建许多工厂实例来完成。
工厂可以创建多个对象实例,但为什么需要有多个工厂实例
单个用户可以创建所需的所有对象。
因此,您应该有一个工厂的单例实例。
要实现它,您可以使用单例DP或依赖项注入(这样更好)。
依赖项注入需要DI框架。
您似乎没有使用它。
作为解决方案,在纯java中,您可以实现一个渴望的单例(感谢Bill Pugh),例如:
WRF wrf = new ...;
现在,您可以通过以下方式创建IDataSources
实例:
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 datasources = WRFFactory.getInstance().CreateModel();
您需要一个实例生成器
private DataFactory() {
}
然后你把它放在主楼里
public static DataFactory getInstance() {
if (DataFactory.dataFactory == null) {
DataFactory.dataFactory = new DataFactory();
}
return DataFactory.dataFactory;
}
这是一个真正的工厂类好的,所以我这样做:
文件IDataSources.java
DataFactory dataFactory = DataFactory.getInstance();
文件Factory.java
package pl.weatherPrediction.interfaces;
public interface IDataSources {
//void getFiles(String url, String folder, String timeStamp);
}
package pl.weatherPrediction.factory;
import pl.weatherPrediction.interfaces.*;
public abstract class Factory {
public abstract IDataSources CreateModel();
}
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();
}
文件SYNOPFactory.java
package pl.weatherPrediction.interfaces;
public interface IDataSources {
//void getFiles(String url, String folder, String timeStamp);
}
package pl.weatherPrediction.factory;
import pl.weatherPrediction.interfaces.*;
public abstract class Factory {
public abstract IDataSources CreateModel();
}
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.interfaces;
public interface IDataSources {
//void getFiles(String url, String folder, String timeStamp);
}
package pl.weatherPrediction.factory;
import pl.weatherPrediction.interfaces.*;
public abstract class Factory {
public abstract IDataSources CreateModel();
}
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();
}
文件Main.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();
}
}
@davidxxx是否正确?您试图从静态
上下文实例化一个非静态
的内部类。这行不通。您需要标记嵌套类静态
(或使用数据工厂的实例实例化它们)。或者更好:按预期在自己的文件中定义每个类。如果我在自己的类中声明它们,我仍然可以使用模式工厂?当然……好的,但现在我正在尝试将工厂划分为自己的类,我是这样做的:SYNOPFactory在自己的文件中,工厂(其他文件中的抽象类),示例公共类SYNOPFactory扩展工厂{@Override public IDataSources CreateModel(){return new SYNOP();}我得到这样的错误:由于一些中间构造函数调用,“您应该在自己的类文件中声明它们,并在自己的类中提取其他类。否则您将有相同的问题。”这是非常好的。只是应该改进工厂子类的实例化方法。我更新了我的答案来解释这一点。是的,是的,我现在正在阅读你的提示@davidxxx:)我更新了一个简单高效的单例实现。但是请注意,在“真正”的项目中,依赖项注入工具应该比这个经典的实现更受欢迎。好吧,在这种情况下,您对singleton的实现将比这个更好?singleton将更简单(不需要自己处理singleton实例化/检索)和更灵活。例如,请参见SpringFramework: