2013-11-27 55 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