我正在尝试改善我的编码风格。请考虑以下情形:
假设我要定义一个自定义ASP.Net Album服务器控件。目的是让用户选择专辑类型,所有其他内容将由控件执行。
我考虑过两种方法:

1-定义一个IAlbum接口(interface),并为每种专辑类型定义一个类(实现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.

实现此目标的最佳方法是什么?
谢谢,对不起,很长的帖子。

最佳答案

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

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

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

10-07 15:49