我正在努力改进我的编码风格。考虑以下场景:
假设我想定义一个自定义 ASP.Net 相册服务器控件。目的是让用户选择相册类型,其他所有事情将由控件执行。
我考虑过两种方法:
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,为每个相册类型定义一个类(实现 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.
实现这一目标的最佳方法是什么?
感谢并抱歉发了这么长的帖子。
最佳答案
当您想要封装有关要创建的特定对象类型的决策时,工厂模式是一个不错的选择。创建方法应该返回一个相册类型,因此它将是:
var myFlashAlbum = Album.create(AlbumTypes.FlashAlbum);
var myJSAlbum = Album.create(AlbumTypes.JSALbum);
如果构建相册的过程明显不同,您可能需要考虑构建器模式。它允许您封装复杂的创建逻辑。
关于.net - 以下场景的最佳设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4172304/