有一个生产工厂的工厂可以吗

本文关键字:工厂 有一个 | 更新日期: 2023-09-27 18:01:00

目标

我需要在每个单元的基础上对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;
    }
    // ...
}

另一种选择是使用元组作为工厂的密钥,但我认为这只是隐藏了我对这类问题的设计问题。

这真的很伤我的大脑。。。在这种情况下,工厂似乎不会削减开支。有没有什么想法让工厂创建工厂是可以的?谢谢

有一个生产工厂的工厂可以吗

我放弃了一家又一家的工厂,最终采用了另一种方法:

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处理这个东西的能力。

"工厂"是"设计模式"类别中的一个术语。它只是一组有助于表达(代码(某些内容的编码约定。

从可维护/可移植等角度来看,什么是好的或不好的。一旦识别参与者和他们的任务/角色和责任,代码就应该变得清晰起来。

您可以使用例如UML序列图(将参与者及其信息交换显示为时间序列(或带有泳道的UML活动图(显示参与者、仅数据对象及其流(或其他UML建模工具。

尝试绘制几个UML设计,以确定您正在设计的系统的真实外观

然后应用一些设计模式对其进行编码

工厂是一种实施工具。不是在数字空间中建模的现实中观察到的主要对象(什么+为什么(

StackOverflow具有uml标记,可以帮助您找到更多提示。

您想要的是一个抽象的工厂模式

有趣的是,它们使用的一个非常常见的模式是处理。。。。(鼓轮(UI!

经典的例子是如何确保,如果你使用窗口主题(windows UI与Mac(,你不会意外/故意混淆主题之间的小部件;例如,带有Windows风格组合框的Mac按钮。

作为一个例子,Java UI就是这样做的。