以下场景的最佳设计模式

时间:2010-11-13 11:32:07

标签: .net oop design-patterns inheritance interface

我正在努力改进我的编码风格。请考虑以下情况:
假设我想定义一个自定义的ASP.Net Album服务器控件。目的是让用户选择相册类型,所有其他内容将由控件执行 我考虑了两种方法:

1-定义IAlbum接口并为每个Album类型定义一个类(实现IAlbum)。例如:

  public class FlashAlbum : IAlbum  
  {  
  // Implement IAlbum Methods...  
  // FlashAlbum-Specific Properties/Methods.  
  }  
  public class JSAlbum : IAlbum  
  {  
  // Implement IAlbum Methods...   
  // JSAlbum-Specific Properties/Methods.  
  }  

因此,如果用户想要一个flash专辑,他应该明确地创建一个FlashAlbum对象。类似的东西:

var myFlashAlbum = new FlashAlbum(/*FlashAlbumParameters*/);  
var myJSAlbum = new JSAlbum(/*JSAlbumParameters*/);  

问题在于我不希望用户必须处理多种相册类型。请阅读以下内容以了解我的意思。

2-定义IAlbum,为每个Album类型定义一个类(实现IAlbum)(就像上面一样)并定义实现IAlbum的Album类。它用于在其构造函数(工厂模式)中创建相册实例。定义EnumAlbumTypes:

Public Enum AlbumTypes  
{  
    FlashAlbum,  
    JSAlbum  
}  

现在为Album Parent类定义一个构造函数,该构造函数接受EnumAlbumTypes类型的参数,并根据参数创建相应的相册。我更喜欢这种方法。但我对工厂模式不是很熟悉。我希望用户创建像:

这样的专辑
var myFlashAlbum = new Album(AlbumTypes.FlashAlbum);  
// Now set FlashAlbum custom properties.
var myJSAlbum = new Album(AlbumTypes.JSAlbum);
// Now set JSAlbum custom properties.  

实现这一目标的最佳方法是什么?
谢谢,抱歉这篇长篇文章。

2 个答案:

答案 0 :(得分:4)

当您想要封装有关要创建的特定对象类型的决策时,工厂模式是一个不错的选择。 create方法应返回Album类型,因此它将是:

   var myFlashAlbum = Album.create(AlbumTypes.FlashAlbum);
   var myJSAlbum = Album.create(AlbumTypes.JSALbum);

如果构建相册的过程明显不同,您可能需要考虑构建器模式。它允许您封装复杂的创建逻辑。

答案 1 :(得分:0)

如果您不希望用户关心他们拥有什么类型的专辑,那么您为什么还要给他们选择?

继承似乎是正确的选择。我没有看到任何支持另一种选择的证据或论据。