.NET BCL 中有建造者模式的示例吗?

4

在.NET基础类库中是否有完整的构建器模式示例?我正在寻找一个具有实际指导者和多个具体构建器的示例。

2个回答

10

虽然我不是这方面的专家,但我认为DbCommandBuilder及其派生类(OdbcCommandBuilderOleDbCommandBuilderSqlCommandBuilder)可能是一个例子...如果抽象生成器基类也充当导演的话是可以的。各个具体类委托给它们的基类,然后调用像这样的方法(通过反射器):

private DbCommand BuildDeleteCommand(DataTableMapping mappings, DataRow dataRow)
{
    DbCommand command = this.InitializeCommand(this.DeleteCommand);
    StringBuilder builder = new StringBuilder();
    int parameterCount = 0;
    builder.Append("DELETE FROM ");
    builder.Append(this.QuotedBaseTableName);
    parameterCount = this.BuildWhereClause(
        mappings, dataRow, builder, command, parameterCount, false);
    command.CommandText = builder.ToString();
    RemoveExtraParameters(command, parameterCount);
    this.DeleteCommand = command;
    return command;
}

这满足了成为构建者(builder)的一些要求:

  • 抽象的构建者类
  • 具体的构建者类
  • 在各种 DbCommandBuilder 方法中完成复杂的多步构建(BuildDeleteCommandBuildInsertCommandBuildUpdateCommand
  • 产品(DbCommand),由具体类强制转换为特定命令类型,它比只是 SQL 字符串更加复杂,因为它有超时、命令类型、可能还有事务等。

但是并没有单独的作为指导者(director)的类;实际上,DbCommandBuilder 基类就是指导者。


2
我不知道是否有多个具体的构建器,除非您将WebRequest.Create计算在内,这是一种相当琐碎的构建方式。 ProcessStartInfoStringBuilder都是作为简单的“一个构建器”示例而合理的。

1
WebRequest.Create是一个工厂方法,而不是一个构建器。你不能传递一个FTP URL并返回一个HTTPWebRequest。 - Jonathan Allen
我在笔记中将另外两个类标记为“通用构建器”模式的示例。对于这个版本,我尝试使用SOAP和二进制格式化程序,但遗憾的是它们似乎缺少导演组件。 - Jonathan Allen

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