加载资源的好方法

时间:2011-03-06 18:43:50

标签: java loading

我正在用Java开发服务器应用程序。我需要从不同的源(XML和数据库)加载一些资源。所以,我需要一些关于如何干净地实现加载的建议。

我有一个“ServerX”类创建了一些“Memory”对象,它就是那些将保存已加载的资源的对象。

我发现了两种不同的加载方式,但两者看起来都很脏。

1

public class ServerX
{
    /**
    Will hold the houses for further use.
    */
    private Memory<House> houses;

    public ServerX()
    {
        houses = new Memory<House>();

        loadHouses();
        loadXX();
        loadYY();
        LoadZZ();
        Load...
    }

    private void loadHouses()
    {
        //Pseudo code
        List<House> loaded = loadHousesFromDatabase();
        houses.addAll(loaded);
    }

    private void loadXX();

    ...
}

但是这样,它充斥着我的“ServerX”类。

2

public interface Loader
{
    public void loadHouses(Memory<House> toFill);
    public void loadXX(Memort<XX> toFill);
    public void loadYY(Memort<YY> toFill);
    public void loadZZ(Memort<ZZ> toFill);
}

public class SimpleLoader implements Loader
{
    //Implements methods.
}

public class ServerX
{
    /**
    Will hold the houses for further use.
    */
    private Memory<House> houses;

    public ServerX(Loader loader)
    {
        houses = new Memory<House>();
        loader.loadHouses(houses);
        loader.loadXX...
    }
}

但是这样,我认为我属于Poltergeist反模式,因为我创建一个新的加载器只是为了对数据库/ XML文件做请求,然后它被垃圾收集。

那么,有没有其他方法可以做到,或者我的解决方案之一是否足够好?

感谢。

2 个答案:

答案 0 :(得分:1)

您可以考虑的一种模式是Service Locator模式。可以找到服务定位器的说明here

基本上,服务定位器是一个注册表+缓存,它组合起来一次查找资源并将其保留在内存中,以便在应用程序的生命周期内进行对象检索。服务定位器主要使用Singleton pattern实现。

答案 1 :(得分:0)

使用Loader界面和多个实现(XMLLoaderDBLoader)的第二个解决方案很好。但是,通过使加载方法返回新的Memory实例而不是将内存作为引用传递来保持加载器和服务器分离。在Memory类中添加一个copyAll方法,将一个内存的内容复制到另一个内存中。 (请参阅javadoc中的ArrayList.addAll或System.arrayCopy)