我正在尝试改善我的编码风格。请考虑以下情形:
假设我要定义一个自定义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);
如果构建相册的过程明显不同,则可能需要考虑构建器模式。它允许您封装复杂的创建逻辑。