带有嵌套对象的生成器模式 [英] Builder pattern with nested objects
问题描述
我遇到了问题。
我想实现构建器模式,以使创建对象更加容易。我面临的问题与嵌套对象有关。我想创建的对象中包含其他对象的列表,但是我对如何处理它并不了解。
I want to implement the builder pattern to make creating my objects easier. The problem I face has to do with nested object. The object I would like to create has a list of other objects in it, and I don't really have an idea on how to tackle it.
我想成为能够执行以下操作(例如,简单的对象):
I want to be able to do the following (Simpler objects for example):
Receipt RestaurantReceipt = new ReceiptBuilder()
.withDate("value")
.withName("value")
.AddItem("value")
.WithIngredients("value")
.WithType("value")
.AddItem("value")
.WithIngredients("value")
.WithType("value")
.build();
或者类似的东西:
Receipt RestaurantReceipt = new ReceiptBuilder()
.withDate("value")
.withName("value")
.AddItem("value", item => {
.WithIngredients("value")
.WithType("value")
})
.AddItem("value", item => {
.WithIngredients("value")
.WithType("value")
})
.build();
示例应能代表我的情况,尽管嵌套对象不止一种。
Example should be representative for my situation, although if got more than one type of nested object.
推荐答案
给出这样的代码
var rb = new ReceiptBuilder();
var receipt = rb.WithName("Name")
.WithDate(DateTime.Now)
.WithItem("Item1", i => i.WithIngredients("Ingredients1"))
.WithItem("Item2", i => i.WithIngredients("Ingredients1"))
.Build();
Console.WriteLine(receipt);
您的构建器非常简单,利用了 WithItem中的一些简单谓词
生成器方法,允许消费者以与顶层 ReceiptBuilder
:
Your builder is pretty simple, making use of some simple predicates inside the WithItem
builder method to allow the consumer to configure each item in a similar "builder" pattern to the top level ReceiptBuilder
:
public class ReceiptBuilder
{
private Receipt r;
public ReceiptBuilder()
{
r = new Receipt();
}
public ReceiptBuilder WithName(string name)
{
r.Name = name;
return this;
}
public ReceiptBuilder WithDate(DateTime dt)
{
r.Date = dt;
return this;
}
public ReceiptBuilder WithItem(string text, Action<ReceiptItemBuilder> itemBuilder)
{
var rib = new ReceiptItemBuilder(text);
itemBuilder(rib);
r.AddItem(rib.Build());
return this;
}
public Receipt Build()
{
return r;
}
}
public class ReceiptItemBuilder
{
private ReceiptItem ri;
public ReceiptItemBuilder(string text)
{
ri = new ReceiptItem(text);
}
public ReceiptItemBuilder WithIngredients(string ings)
{
ri.Ingredients = ings;
return this;
}
// WithType omitted for brevity.
internal ReceiptItem Build()
{
return ri;
}
}
工作示例: http://rextester.com/IRR50897
这篇关于带有嵌套对象的生成器模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!