【发布时间】:2011-05-09 12:12:38
【问题描述】:
我正在努力改进我的编码风格。考虑以下场景:
假设我想定义一个自定义的 ASP.Net Album 服务器控件。目的是让用户选择专辑类型,所有其他的东西都将由控件进行。
我考虑了两种方法:
1- 定义一个 IAlbum 接口并为每个专辑类型定义一个类(实现 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.
实现这一目标的最佳方法是什么?
感谢和抱歉发了这么长的帖子。
【问题讨论】:
-
您似乎回答了自己的问题。工厂模式似乎更好地满足了您的期望,即用户不必通过封装特定类型的创建来处理多种专辑类型。您对实施这种模式有什么顾虑?
-
正如您在我的代码中看到的,我错误地调用了主工厂类。
new Album(AlbumType.FlashAlbum)是正确的。我应该这样称呼它:AlbumFactory.Create(AlbumType.FlashAlbum)。附言由于我是使用设计模式的新手,所以我想确保自己走在正确的道路上。
标签: .net oop design-patterns inheritance interface