gpt4 book ai didi

java - 在java中创建父对象的基础上创建子对象

转载 作者:行者123 更新时间:2023-12-01 07:47:48 25 4
gpt4 key购买 nike

我正在学习java设计模式,我想知道我是否可以应用一些来解决以下问题。我有士兵类和一些子类,例如:将军和中士。我正在创建 Solider 对象,并且在运行时我想将此对象更改为 General 或 Sergeant 对象,或者使用之前创建的 Solider 对象创建新的 Sergeant 或 General 对象:

 Solider s = new Solider(...);
.....
if (generalCondition) {
General g = createGeneralFromSolider(s);
//or better:
//General g = promoteSoliderToGeneral(s);
} else if (sergeantCondition) {
Sergeant sr = createSergeantFromSolider(s);
//or better:
//Sergeant sr = promoteSoliderToSergeant(s);
}

首先,我决定在将军/中士类中创建额外的构造函数:

Class General extends Solider {
General(Solider s, Map<String, String> generalSpecificParams) {
//first we are going to copy all solider params to general params (bad idea if we have a lot of params)
this.setParamX(s.getParamX());
....
//then we can assign the rest of general-specific params
this.setGeneralSpecificParams(generalSpecificParams);
}
}

并在 createGeneralFromSolider 方法中使用它,但我不确定这是否是一种优雅的方式。主要缺点是我创建了新对象,因此在调用 createGeneralFromSolider 后,内存中有 2 个对象。我宁愿在内存中拥有一个对象:从士兵晋升的将军/中士(将军/中士对象,之前是士兵对象)。我想知道是否可以使用一些设计模式来解决它。我记得在 C++ 中存在类似复制构造函数的东西,它通过一个接一个地分配所有参数,将所有参数从一个对象复制到另一个对象。在 Java 中我没有听说过类似的事情。

最佳答案

您可能需要使用 Factory这种情况的模式。例如:

public class SoldierFactory {

//use getSoldier method to get object of type Soldier
public Soldier getSoldier(String soldierType){
if(soldierType == null){
return null;
}
if(soldierType.equals("case1")){
return new General();

} else if(soldierType.equals("case2")){
return new Sergeant();

} else if(.....

}

return null;
}
}




public class FactoryPatternDemo {

public static void main(String[] args) {
SoldierFactory soldierFactory = new SoldierFactory();

Soldier s1 = soldierFactory.getsoldier("case1");


}
}

我认为最好不要在调用 Soldier 工厂之前创建 Soldier。不管在运行时你都会改变它吗?

关于java - 在java中创建父对象的基础上创建子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com