2012-12-14 136 views
1

我理解這兩種模式(我認爲),但考慮到我的具體需求,我似乎無法找到解決方案或找到一個示例(所有示例都非常簡單)。設計構建或工廠模式

我的問題是,我想要某種工廠(或導演/等),創建可能或不可能有依賴關係的對象。

讓我們假設我有這樣的代碼:(我使用C#)

interface MyObject{ 
    public void load(); 
    public void update(); 
    public void draw(); 
} 

class ObjectA : MyObject{ 
    public void load(){/*load*/} 
    public void update(){/*update*/} 
    public void draw(){/*draw*/} 
} 

class ObjectB : MyObject{ 
    Texture texture; 
    public ObjectB(Content content){ 
     texture = content.load("texture"); 
    } 
    public void load(){/*load*/} 
    public void update(){/*update*/} 
    public void draw(){/*draw*/} 
} 

class ObjectC : MyObject{ 
    Parent parent; 
    public void setParent(Parent parent){ 
     this.parent = parent; 
    } 
    public void load(){/*load*/} 
    public void update(){ 
     if(this.status == Status.Done){ 
      parent.remove(this); 
     } 
    } 
    public void draw(){/*draw*/} 
} 

class Map : Parent{ 
    MyObject myobj; 
    public void load(MapInfo map){ 
     //This is what I want to achieve 
     myobj = MyObjectFactory.create(map.objectInfo); 

     //This is my problem. I don't really know how to solve this. 
     //I can't do this > 
     myobj.setParent(this); //error 
     //Unless I create a setParent method in interface, I don't know how to achieve this. 
    } 
    public void remove(MyObject obj){/*remove*/} 
} 

我真的不知道該如何實現這個:myobj.setParent(this);。它不能在構造函數中(如ObjectB),因爲每個情況下Parent都不相同。

這是我必須爲我廠:

class MyObjectFactory{ 
    Content content; 
    public MyObjectFactory(Content content){ 
     this.content = content; 
    } 

    public MyObject create(objectInfo){ //suppose objectInfo is xml 
     //read xml 
     Type type = objectInfo.type; 

     //I'm totally fine with this. (Noob implementation) 
     switch(type){ 
      case Type.A: 
       return new ObjectA(); 
      break; 
      case Type.B: 
       //I'm also fine with this, unless there is a better way. 
       return new ObjectB(this.content); 
      break; 
      case Type.C: 
       return new ObjectC(); 
      break; 
     } 
    } 
} 

到目前爲止對象A和對象B都不錯。 ObjectA很簡單。 ObjectB構造函數由Factory設置(Factory以前給出的變量爲content)。

這留下了ObjectC,它需要Parent去除它(它可能不是最好的例子,試圖模擬不同的需求)。 我該如何做到這一點?

我只想出了一個解決方案:向MyObject接口添加一個方法,ObjectA和ObjectB將只有一個setParent方法,它不執行任何操作。

我希望這不會造成混淆。

編輯 我忘了在添加父:class Map : Parent

回答

3

我覺得你與對象的創建混合行爲。工廠方法和生成器都是創造性的設計模式。所以你可以用它來創建對象。請記住,這些模式只會解決您的對象創建問題。

其他行爲方面(如你所說的你想達到某種特定行爲)不是這些設計模式的一部分。所以,你必須靈活地用自己的方式做,但一定要記住這些設計原則OCP一樣,SRP,DIP等

這些模式這個問題SO會談:factory method (1) vs factory(2) vs Builder (3) pattern

+0

謝謝你讓我意識到創造型模式並不能解決我想要做的事情。 – OsakaHQ

+0

歡迎.. :) –

1

一個簡單的,如果不優雅,修復會將'this'傳遞給您的工廠,並且只在需要時才讓工廠調用setParent(),因爲工廠知道實現細節。

myobj = MyObjectFactory.create(map.objectInfo, this); 

    case Type.C: 
    var inst = new ObjectC(); 
    inst.setParent(parent);