首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java - Factory,实例

Java - Factory,实例
EN

Stack Overflow用户
提问于 2017-11-17 19:33:21
回答 3查看 310关注 0票数 1
代码语言:javascript
复制
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的实例)。

我做错什么了?

问候

EN

回答 3

Stack Overflow用户

发布于 2017-11-17 19:37:28

SYNOPFactoryWRFFactory被声明为DataFactory的内部类。

这意味着它们的实例需要一个DataFactory实例。

您可以实例化它们,例如

代码语言:javascript
复制
Factory factory = new DataFactory().new WRFFactory();

但事实上,让它们成为内部类是没有意义的。

为什么需要将它们的实例与DataFactory紧密结合起来呢?

您应该在它们自己的类文件中声明它们。

并在自己的类中提取其他类。否则你也会有同样的问题。

请注意,如果要向客户端隐藏IDataSources实现,可以将它们的子类声明为创建它们实例的工厂子类的私有类成员:

代码语言:javascript
复制
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();
    }
}

这样,在您通过接口进行编程时,这将编译得很好:

代码语言:javascript
复制
Factory factory = new WRFFactory();
IDataSources dateSources = factory.CreateModel();

但是,这将不会像现在一样,WRFWRFFactory类是私有的:

代码语言:javascript
复制
WRF wrf = new ...;

还请注意,不需要创建多个工厂实例。

重复new DataFactory()成语将通过创建许多工厂实例来结束。

工厂可能创建多个对象实例,但为什么需要多个工厂实例?

一个人可以创建所有你需要的对象。

因此,您应该有一个工厂的单例实例。

要实现这一点,您可以使用单例DP或依赖项注入(这更好)。

依赖注入需要一个DI框架。

你似乎没有使用它。

作为解决办法,在普通java中,您可以实现一个热切的Singleton (感谢Bill ),例如:

代码语言:javascript
复制
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实例:

代码语言:javascript
复制
IDataSources datasources = WRFFactory.getInstance().CreateModel();
票数 2
EN

Stack Overflow用户

发布于 2017-11-17 20:07:07

好吧,我就是这样做的:

文件IDataSources.java

代码语言:javascript
复制
package pl.weatherPrediction.interfaces;

public interface IDataSources {
    //void getFiles(String url, String folder, String timeStamp);
}

文件Factory.java

代码语言:javascript
复制
package pl.weatherPrediction.factory;

import pl.weatherPrediction.interfaces.*;

public abstract class Factory {
    public abstract IDataSources CreateModel();
}

文件SYNOPFactory.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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?

票数 1
EN

Stack Overflow用户

发布于 2017-11-17 19:42:32

你需要那个物体

private static DataFactory dataFactory;

你需要一个私人的建设者

代码语言:javascript
复制
    private DataFactory() {
}

你需要一个实例生成器

代码语言:javascript
复制
    public static DataFactory getInstance() {

    if (DataFactory.dataFactory == null) {
        DataFactory.dataFactory = new DataFactory();

    }

    return DataFactory.dataFactory;

}

那你就叫它主

代码语言:javascript
复制
DataFactory dataFactory = DataFactory.getInstance();

这是真正的工厂级

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47358020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档