代码之家  ›  专栏  ›  技术社区  ›  Kamyar

以下场景的最佳设计模式

  •  7
  • Kamyar  · 技术社区  · 14 年前

    我正在努力改进我的编码风格。考虑以下情况:
    假设我想要定义一个自定义的ASP.NET相册服务器控件。这样做的目的是让用户选择专辑类型,所有其他的事情都将由控件执行。
    我考虑过两种方法:

    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),并定义 Album 类别 没有 实现IAlbum。它用于在其构造器(工厂模式)中创建相册实例。定义枚举类型:

    Public Enum AlbumTypes  
    {  
        FlashAlbum,  
        JSAlbum  
    }  
    

    现在,为Album父类定义一个构造函数,该类接受类型为EnumalBumTypes的参数,并基于该参数创建适当的Album。我喜欢这种方法。但我对工厂模式不太熟悉。我希望用户创建如下相册:

    var myFlashAlbum = new Album(AlbumTypes.FlashAlbum);  
    // Now set FlashAlbum custom properties.
    var myJSAlbum = new Album(AlbumTypes.JSAlbum);
    // Now set JSAlbum custom properties.  
    

    实现这一目标的最佳方法是什么?
    多谢你的好意。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Vincent Ramdhanie    14 年前

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

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

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

        2
  •  0
  •   Puppy    14 年前

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

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

    推荐文章