簡體   English   中英

在工廠方法中避免instanceof

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM