我正在学习Java,并且想保存应用程序状态。在面向对象的编程中,我们应该隐藏实现并通过接口共享功能。在不需要从数据库还原数据之前,它可以正常工作。
例如。如果应用程序包含具有使用过的单例设计模式的IdGenerator类构建,则可以在对象创建期间使用它来生成唯一的ID。因此,接口仅共享getId()方法。但是,如果我想从数据库中还原对象怎么办?我只需要setId()方法来还原对象。有什么解决方案(我的意思是某种解决问题的设计模式)? 我对Spring和JUnit有同样的问题。我不知道我是否不了解某些内容,否则它会强制将getter和setter用于我们要注入的所有内容。
我创建了示例项目:
在模型包中。people是接口Person:
public interface Person {
long getId();
Person setName(String name);
String getName();
}
因此同一包具有实现类:
public class PersonImpl implements Person {
private long id;
private String name;
public PersonImpl(String name){
this.id = IdGenerator.getInstance().getID();
}
@Override
public long getId() {
return this.id;
}
@Override
public Person setName(String name) {
this.name = name;
return this;
}
@Override
public String getName() {
return this.name;
}
}
IdGenerator类是这样的:
public class IdGenerator {
private static IdGenerator instance;
private long lastId;
private IdGenerator(){
lastId = 0;
}
public static IdGenerator getInstance(){
if (instance==null){
instance = new IdGenerator();
}
return instance;
}
public long getID(){
return lastId++;
}
}
因此,每个对象的ID都是唯一的,并且无法更改。这是Person接口不提供名为setId()的方法的原因。结果,我可以创建任何用于从数据库或文件还原数据的类:
public class DataLoader {
public boolean loadData(String filePath){
.
.
.
.
long loadedId = ....
String loadedName = ....
Person personRestoredObject = PersonImpl(loadedName);
}
}
,但无法还原旧ID。 ID由构造函数创建。那么,该问题有任何设计模式吗?
我看到了一个解决方案,方法是添加一个Factory类,该类可以访问程序包级别的setId()方法或仅在程序包级别可用的特殊构造函数。但是我看不到在实践中不提供setId()方法的可能性,因为那样我就无法恢复对象的数据源。我错了吗?