【问题标题】:Best Design Pattern for the Following Scenario以下场景的最佳设计模式
【发布时间】: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


【解决方案1】:

当您想要封装有关要创建的特定对象类型的决定时,工厂模式是一个不错的选择。 create 方法应该返回一个 Album 类型,因此它将是:

   var myFlashAlbum = Album.create(AlbumTypes.FlashAlbum);
   var myJSAlbum = Album.create(AlbumTypes.JSALbum);

如果构建相册的过程有很大不同,您可能需要考虑构建器模式。它允许您封装复杂的创建逻辑。

【讨论】:

  • 谢谢! builder 模式似乎很有趣。
  • “var”也可以替换为 IAlbum。
【解决方案2】:

如果你不想让用户关心他们拥有什么样的专辑,那你为什么还要给他们选择呢?

在这里继承似乎是正确的选择。我没有看到任何支持另一种选择的证据或论据。

【讨论】:

  • 我希望用户拥有一个对象并能够更改那张专辑的样式。不要创建其他类型的对象。
猜你喜欢
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2011-02-19
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多