Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-Factory,实例_Java_Design Patterns_Factory - Fatal编程技术网

Java-Factory,实例

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

我收到如下错误消息:

无法访问DataFactory类型的封闭实例。必须符合条件 带有DataFactory类型的封闭实例的分配(例如。 x、 新建A(),其中x是DataFactory的实例)

我做错了什么


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: