【问题标题】:Better to use constructor or method factory pattern?更好地使用构造函数或方法工厂模式?
【发布时间】:2010-05-02 05:25:09
【问题描述】:

我有一个名为 BitmapZone 的 Bitmap 类的包装类。

假设我们有一个 WIDTH x HEIGHT 位图图片,这个包装类应该用于允许我发送到其他方法/类本身而不是原始位图。然后我可以更好地控制用户可以或不允许对图片做什么(而且我不必多次复制位图来为每个方法/类发送)。

我的问题是:知道所有的 BitmapZone 都是从位图创建的,你觉得更喜欢什么?

构造函数语法:类似

BitmapZone bitmapZone = new BitmapZone(originalBitmap, x, y, width, height);

工厂方法模式:

BitmapZone bitmapZone = BitmapZone.From(originalBitmap, x , y, width, height);

工厂方法模式:

BitmapZone bitmapZone = BitmapZone.FromBitmap(originalBitmap, x, y, width, height);

其他?为什么?

谢谢

【问题讨论】:

    标签: c# java oop constructor factory-pattern


    【解决方案1】:

    在这种情况下,我认为没有理由使用静态方法。构造函数运行良好,是构造新 BitmapZone 的“明显”方式。

    如果你想改变构造行为,你通常会求助于静态方法。例如,如果参数相同,则返回先前构造的实例的缓存机制。这不能通过构造函数来实现,构造函数总是返回一个新实例。

    【讨论】:

    • 我正要说同样的话:缓存。对不可变对象有意义
    【解决方案2】:

    我会使用第二种工厂方法 - 它使您的代码更具可读性和更直观的使用方式。如果你还没有读过 Joshua Bloch 的 Effective Java,你最好读一读——这是一本很棒的书,虽然它不是关于 C#,但它会完美地回答你的问题。

    【讨论】:

      【解决方案3】:

      把方法放在Bitmap而不是BitmapZone

      BitmapZone bitmapZone = originalBitmap.GetZone(x, y)
      

      您自己说过:“每个 BitmapZone 都是从 Bitmap 创建的”。这样您就可以从五个参数变为两个参数,因为您不需要传入位图,并且每个位图大概都知道自己的宽度和高度。
      (否则你打算怎么做?new BitmapZone(originalBitmap, x, y, originalBitmap.Width, originalBitmap.Height)?丑陋。)

      如果您无法更改 Bitmap 类,请将其设为扩展方法(当然,这在 Java 中不起作用)。

      【讨论】:

      • 位图是你无法控制的系统类。
      • 你一定是个 Java 人 :P Bitmap 是一个 .NET 框架的密封类,所以我不能这样做 :( 虽然我可以将它添加为扩展方法(这样它就可以正常工作)正如你所说)。
      • 查看我的编辑 :) 我只是建议将其作为扩展方法。
      【解决方案4】:

      我更喜欢后一个示例 (BitmapZone.FromBitmap) 而不是中间那个,只是因为它的意图更清晰,简洁性可以忽略不计。老实说,我对第一个和最后一个示例没有任何偏好。使用最适合您的架构的模式。查看factory method pattern 的优缺点 - 在这种情况下它是否适合您取决于您​​的设计细节。

      我自己,我会从一个简单直接的构造函数开始,除非我有充分的理由不这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-23
        • 2010-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多