我正在用Java开发服务器应用程序。我需要从不同的源(XML和数据库)加载一些资源。所以,我需要一些关于如何干净地实现加载的建议。
我有一个“ServerX”类创建了一些“Memory”对象,它就是那些将保存已加载的资源的对象。
我发现了两种不同的加载方式,但两者看起来都很脏。
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”类。
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文件做请求,然后它被垃圾收集。
那么,有没有其他方法可以做到,或者我的解决方案之一是否足够好?
感谢。
答案 0 :(得分:1)
您可以考虑的一种模式是Service Locator模式。可以找到服务定位器的说明here。
基本上,服务定位器是一个注册表+缓存,它组合起来一次查找资源并将其保留在内存中,以便在应用程序的生命周期内进行对象检索。服务定位器主要使用Singleton pattern实现。
答案 1 :(得分:0)
使用Loader
界面和多个实现(XMLLoader
和DBLoader
)的第二个解决方案很好。但是,通过使加载方法返回新的Memory
实例而不是将内存作为引用传递来保持加载器和服务器分离。在Memory类中添加一个copyAll方法,将一个内存的内容复制到另一个内存中。 (请参阅javadoc中的ArrayList.addAll或System.arrayCopy)