[英]Avoiding instanceof in factory method
我正在尋找以下問題的改進解決方案。 我有一個對象,該對象已傳遞給工廠。 工廠將檢查對象類型,創建另一個類型,並使用傳入對象中的數據填充該類型,然后返回新的類型。
...
public MyAbstractClass create(MyObject a) {
if (a instanceof A) {
A obj = (A) a;
return new MyAbstractClass_1 (obj.getField(), factoryField);
}
else if (a instanceof B) {
B obj = (B) a;
return new MyAbstractClass_2 (obj.getSomething(), obj.getSomethingElse(), factoryField);
}
}
返回類型的實例通常被視為后綴。 展望未來,我需要支持更多類型,如果可能的話,我希望避免使用instanceof
解決方案。 我該如何改善?
您可以將create方法添加到MyObject嗎? 這樣,您將不再需要實例,因為MyObject的每個實例都知道如何“創建”。 你不會再有工廠了:(
它看起來像(假設MyObject是一個接口。如果它是一個類,則直接擴展):
interface MyObject {
...
public MyAbstractClass create(MyObject a);
...
}
public class A implements MyObject {
...
public MyAbstractClass create(MyObject a) {
return new MyAbstractClass_1 (obj.getField(), factoryField);
}
...
}
public class B implements MyObject {
...
public MyAbstractClass create(MyObject a) {
return new MyAbstractClass_2 (
obj.getSomething(),
obj.getSomethingElse(),
factoryField);
}
...
}
if
語句的主體應該是MyObject
上的虛擬或抽象成員。
abstract class MyObject {
public abstract MyAbstractClass create();
}
class A extends MyObject {
@Override
public MyAbstractClass create(Object factoryField) {
return new MyAbstractClass_1 (this.getField(), factoryField);
}
}
class B extends MyObject {
@Override
public MyAbstractClass create(Object factoryField) {
return new MyAbstractClass_2 (this.getSomething(), this.getSomethingElse(), factoryField);
}
}
通常,當您看到自己檢查對象的類型以根據具體類型進行不同的操作時,這可能意味着您應使用多態性,並且代碼應直接進入具體類型。
如您所指出的那樣,更新了MyObject
數據應來自當前實例,而不應作為參數傳遞。 唯一的問題是我不確定您現在將factoryField
放在factoryField
。 您可以像上面一樣將其作為參數傳遞,由於這些是虛擬成員,因此您仍然可以擁有一個工廠:
class SomeFactory {
private Object factoryField;
public SomeFactory(Object factoryField) {
this.factoryField = factoryField;
}
public MyAbstractClass create(MyObject a) {
return a.create(factoryField);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.