Kam*_*yar 7 .net oop inheritance design-patterns interface
我正在努力改进我的编码风格.请考虑以下情形:
假设我要定义自定义ASP.Net相册服务器控件.目的是让用户选择相册类型,所有其他内容将由控件执行.
我考虑过两种方法:
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.
}
Run Code Online (Sandbox Code Playgroud)
因此,如果用户想要一个flash专辑,他应该明确地创建一个FlashAlbum对象.就像是:
var myFlashAlbum = new FlashAlbum(/*FlashAlbumParameters*/);
var myJSAlbum = new JSAlbum(/*JSAlbumParameters*/);
Run Code Online (Sandbox Code Playgroud)
问题是我不希望用户必须处理多种相册类型.请阅读以下内容以了解我的意思.
2-定义IAlbum,定义一个类(该类实现IAlbum)对于每个专辑类型(就像上文),并定义Album哪些类不实现IAlbum.它用于在其构造函数(工厂模式)中创建相册实例.定义EnumAlbumTypes:
Public Enum AlbumTypes
{
FlashAlbum,
JSAlbum
}
Run Code Online (Sandbox Code Playgroud)
现在为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.
Run Code Online (Sandbox Code Playgroud)
实现这一目标的最佳方法是什么?
谢谢和抱歉长篇文章.
当您想要封装有关要创建的特定对象类型的决策时,工厂模式是一个不错的选择。创建方法应该返回一个相册类型,因此它将是:
var myFlashAlbum = Album.create(AlbumTypes.FlashAlbum);
var myJSAlbum = Album.create(AlbumTypes.JSALbum);
Run Code Online (Sandbox Code Playgroud)
如果构建相册的过程明显不同,您可能需要考虑构建器模式。它允许您封装复杂的创建逻辑。