2013-11-27 77 views
0

任何人都可以幫助我確定在以下代碼段中使用哪種設計模式。它看起來有點像一半戰略模式泛型。這是一個簡單的示例代碼,並沒有從實際的代碼庫中取得。識別此代碼的設計模式

我之所以說它看起來像一個策略模式,是因爲它似乎正在使用控制器中的泛型轉移行爲邏輯,如DogController<DogRepository>。它本可以像animalController.Repository = new DogRepository()

void Main() 
{ 
    var animalController = new DogController(); 
    animalController.PrintName(); 
} 

abstract class AnimalControllerBase<TRepository> where TRepository : IAnimalRepository 
{ 
    protected abstract TRepository AnimalRepository {get;} 

    public void PrintName() 
    { 
     Console.WriteLine(AnimalRepository.Get()); 
    } 
} 

class DogController : AnimalControllerBase<DogRepository> 
{ 
    protected override DogRepository AnimalRepository 
    { 
     get 
     { 
      return new DogRepository(); 
     } 
    } 
} 

class CatController : AnimalControllerBase<CatRepository> 
{ 
    protected override CatRepository AnimalRepository 
    { 
     get 
     { 
      return new CatRepository(); 
     } 
    } 
} 

interface IAnimalRepository 
{ 
    string Get(); 
} 

class DogRepository : IAnimalRepository 
{ 
    public string Get() 
    { 
     return "Hello, I am Steve the dog.."; 
    } 
} 

class CatRepository : IAnimalRepository 
{ 
    public string Get() 
    { 
     return "Hello, I am Michael the cat.."; 
    } 
} 
+0

看起來很像namedropping,特別是「存儲庫」部分。如果有任何設計模式,這裏有一個小工廠方法。版本庫和控制器可以完全忽略! –

回答

1

我會說這是變相的Factory Method模式。 AnimalControllerBase定義了工廠方法模式,即protected abstract TRepository AnimalRepository {get;}和每個子類或具體工廠方法實現的接口提供了實際的造物代碼:

// disguise of a concrete Factory Method implementation that creates instances of 
// DogRepository and every time you call get you get a new instance 
class DogController : AnimalControllerBase<DogRepository> 
{ 
    protected override DogRepository AnimalRepository 
    { 
     get 
     { 
      return new DogRepository(); 
     } 
    } 
} 

爲什麼不策略?面向對象的結構是相似的,但在概念上有很大的不同。策略「參數化」行爲,而在這裏您有實例創建參數化。實際上大多數設計模式歸結爲幾個OO結構,例如Proxy與Decorator完全一樣的OO結構,但從概念上講,它們非常不同。

+0

你會詳細解釋一下你的答案。您在哪個代碼部分中看到了工廠模式,以及它如何與工廠方法模式相似? – Tarik