有一个生产工厂的工厂是否可行?

3

目标

我需要以泛型接口的帮助,对每个单元格进行System.Data.DataTable的注释,同时隐藏实现细节。

我尝试过的方法

我发现DataColumn有一个ExtendedProperties集合,可以在其中添加一些特定逻辑,但这些注释并不属于列或行。当然,DataRow没有这样的数据包,我也不想为了一些注释而实现和测试整个DataTable的派生类型。

目前的解决方案

由于数据表没有单元格的概念,只能通过DataRowDataColumn访问单个值,因此我考虑从数据表中派生出一个工厂,使其成为工厂的工厂:

using System.Data;
class AnnotatedDataTable: DataTable, IFactory<DataRow, IFactory<DataColumn, IDataCellAnnotation>>
{
    // ...
    public IFactory<DataColumn, IDataCellAnnotation> Create(DataRow row)
    {
        return someAnnotationFactoryForTheGivenRow;
    }
    // ...
}

另一个选择是使用元组作为工厂的关键字,但我认为这只是隐藏了我在这种情况下的设计问题。
这真的让我困扰...在这种情况下,工厂似乎行不通。是否有任何想法,是否可以让工厂创建工厂?谢谢!

6
欢迎来到工厂地狱。 - Kilazur
@Kilazur 你让我的一天变得美好。谢谢你。 - Servy
3个回答

1

我放弃了工厂的工厂,最终选择了另一种方法:

interface IDataCellAnnotation
{
    // Some annotations for a data cell ...
}

interface IAnnotatedTable
{
    IEnumerable<IDataCellAnnotation> GetCellAnnotations(System.Data.DataRow row);
}

class AnnotatedDataTable : DataTable, IAnnotatedTable
{
    // ...

    public IEnumerable<IDataCellAnnotation> GetCellAnnotations(System.Data.DataRow row)
    {
        return theAnnotationsForTheGivenRow;
    }
}

现在这样做不再让我感到头疼,而且更加干净整洁,同时仍然能够将该物件作为IAnnotatedTable在我的程序集之外进行处理。


0
“Factory”是“设计模式”类别中的一个术语。它仅仅是一组编码约定,有助于表达(编码)某些内容。
从可维护性/可移植性等角度来看,什么是可以接受的或不可以接受的应该在您确定了“参与者”及其“任务/角色和责任”后变得清晰明了。
您可以使用例如UML序列图(显示参与者及其信息交换的时间顺序)或带泳道的UML活动图(显示参与者、仅数据对象及其流程)或其他UML建模工具。
尝试绘制几个UML设计,以决定您正在设计的系统真正的样子。
然后应用一些设计模式进行编码。
工厂是一种实现工具(如何)。而不是在数字空间中建模的现实中观察到的主要对象(什么+为什么)。
StackOverflow有标签,可以帮助您找到更多提示。

0

你需要的是抽象工厂模式

有趣的是,它们的常见用法之一是处理……(鼓点)用户界面!

经典的例子是如何确保,如果您正在使用窗口主题(Windows UI vs. Mac),您不会意外/故意混淆主题之间的小部件;例如:Mac按钮与Windows样式组合框。

举个例子,这就是Java UIs的做法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接