我正在努力改进我的编码风格。请考虑以下情况:
假设我想定义一个自定义的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.
实现这一目标的最佳方法是什么?
谢谢,抱歉这篇长篇文章。
答案 0 :(得分:4)
当您想要封装有关要创建的特定对象类型的决策时,工厂模式是一个不错的选择。 create方法应返回Album类型,因此它将是:
var myFlashAlbum = Album.create(AlbumTypes.FlashAlbum);
var myJSAlbum = Album.create(AlbumTypes.JSALbum);
如果构建相册的过程明显不同,您可能需要考虑构建器模式。它允许您封装复杂的创建逻辑。
答案 1 :(得分:0)
如果您不希望用户关心他们拥有什么类型的专辑,那么您为什么还要给他们选择?
继承似乎是正确的选择。我没有看到任何支持另一种选择的证据或论据。