【问题标题】:Is there a pattern where you have a class whose job it is to instantiate common implementations of another class?有没有一种模式,你有一个类,它的工作是实例化另一个类的常见实现?
【发布时间】:2013-07-15 02:47:32
【问题描述】:

我想称它为“帮手”,但这似乎太笼统了。

假设我有一个名为 WidgetCrankerWidgetCranker 的类可以设置为生成 SquareKeyholeGearShape 类型的小部件。我还可以指定我希望我的小部件是哪个Color,以及我希望在它们上标记哪个Label

现在,设置WidgetCranker 的每个实例是相当复杂的,构造函数只给你一个空的WidgetCranker,你必须手动设置你想要启动的小部件的类型和颜色。

WidgetCranker keyholeWidget = new WidgetCranker();
keyholeWidget.Type = WidgetTypes.Keyhole;
keyholeWidget.Color = WidgetColors.Red;
keyholeWidget.Label = "ACME Industries Prototype 1";

但是我有一个类需要很多WidgetCrankers,除了标签之外几乎所有的东西看起来都一样。我想让我的代码更具可读性并且维护起来更省力,所以我创建了一个帮助类来为我完成所有工作。所以上面现在变成了:

WidgetCranker keyholeWidget = WidgetCrankerHelper.RedKeyhole("ACME Industries Prototype 1");

我的问题有两个:

  1. 这是一种实际的设计模式吗?如果是,我们怎么称呼它?我想称它为工厂,但它绝对不是工厂模式。在每种情况下,我们都在创建完全相同类型的对象,只是以不同的方式实例化它们。我知道这是一种“帮手”,但如果可以的话,我想更具体一些。它是一个做非常具体的事情的助手。

  2. 鉴于“Helper”是一个非常通用的名称,我觉得仅仅通过它产生的方法来命名是不够的。我应该给它命名,这样它的作用就很明显了。那么MakeRedKeyholeBuildRedKeyhole 会更好吗?我不想使用GetRedKeyhole,因为这意味着我们正在取回对现有实例的引用,而不是创建一个全新的实例。

【问题讨论】:

  • 它仍然是一个工厂......只是不是一个抽象工厂
  • 绝对是工厂:)
  • 你去。多谢你们。我在考虑抽象工厂,结果陷入了困境。
  • 工厂可以返回不同类型的具体对象。然而,返回配置不同而不是不同类型的简单对象仍然有效。
  • 还应考虑 [Builder][1] 模式。 [1]:stackoverflow.com/questions/757743/…

标签: c# oop design-patterns helper


【解决方案1】:

我倾向于远离“帮助者”这个词,因为所有课程都应该是有帮助的,对吧? :)

我认为将其称为 Factory 或 Builder 是可以接受的。抽象工厂的重点是封装对象的构造/实例化。它可以返回不同的类型,但它不需要返回。消耗工厂的类型不应该关心。

当它做任何复杂的构造时,我倾向于使用“Builder”这个名字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 2018-06-19
    • 2016-01-07
    • 2016-06-11
    • 2014-03-25
    相关资源
    最近更新 更多