- Làm cách nào chúng tôi có thể triển khai mẫu Builder của Joshua's Effective Java trong C#?
Dưới đây là mã tôi đã thử, có cách nào tốt hơn để thực hiện việc này không?Làm cách nào để triển khai và mở rộng mẫu xây dựng của Joshua trong .net?
public class NutritionFacts
{
public static NutritionFacts.Builder Build(string name, int servingSize, int servingsPerContainer)
{
return new NutritionFacts.Builder(name, servingSize, servingsPerContainer);
}
public sealed class Builder
{
public Builder(String name, int servingSize,
int servingsPerContainer)
{
}
public Builder totalFat(int val) { }
public Builder saturatedFat(int val) { }
public Builder transFat(int val) { }
public Builder cholesterol(int val) { }
//... 15 more setters
public NutritionFacts build()
{
return new NutritionFacts(this);
}
}
private NutritionFacts(Builder builder) { }
protected NutritionFacts() { }
}
Làm thế nào để chúng tôi mở rộng một lớp học như vậy? Do , chúng ta cần viết các trình tạo riêng biệt cho mỗi lớp học bắt buộc ?
public class MoreNutritionFacts : NutritionFacts { public new static MoreNutritionFacts.Builder Build(string name, int servingSize, int servingsPerContainer) { return new MoreNutritionFacts.Builder(name, servingSize, servingsPerContainer); } public new sealed class Builder { public Builder(String name, int servingSize, int servingsPerContainer) {} public Builder totalFat(int val) { } public Builder saturatedFat(int val) { } public Builder transFat(int val) { } public Builder cholesterol(int val) { } //... 15 more setters public Builder newProperty(int val) { } public MoreNutritionFacts build() { return new MoreNutritionFacts(this); } } private MoreNutritionFacts(MoreNutritionFacts.Builder builder) { } }
>> "phù hợp với trình khởi tạo đối tượng của C# 3." Trong trường hợp này sẽ được tạo ra như SomeMessage.Build mới (Tên =" GK ", Age = 0).Nhưng nó tốt như viết SomeMessage mới (Tên =" GK ", Age = 0) phải không? Trong trường hợp này làm Chúng ta cần phương pháp xây dựng như thế nào? Nó sẽ giúp chúng ta tránh các nhà xây dựng lồng ghép như thế nào? –
Không, nó sẽ được viết như mới SomeMessage.Builder {Name = "GK", Age = 0} Ghi chú sự khác biệt trong dấu ngoặc vs dấu ngoặc. Lưu ý rằng với C# 4, một hàm tạo duy nhất có rất nhiều tham số tùy chọn sẽ cung cấp một tùy chọn khác –
Ok, bây giờ tôi đã nhận nó mới SomeMessage {Name = "GK", Age = 0 } không thể là các thuộc tính riêng tư, chỉ người xây dựng mới có thể truy cập nó –