Bu desen benim tarafımdan geliştirildi. Eğer bir nesnenin özelliği (örnekte özellik "id") kolleksiyondaki nesnelerden yatay (aynı listede) ve dikey (chield-parent ilişkisi) etkileniyorsa bu desen kullanılabilir. Bunun dışında "Parent-Chield" ilişkisi olan modellerde bu ilişkinin doğal yoldan oluşmasını sağlayabilirsiniz yani nesnenin ParentObject veya ChieldObject diye bir parametresi varsa bunları belirtmenizi gereksiz kılar.(Nesne eklenme esnasında bu belirtimleri kendisi yapar.) Hiyerarşik controllerde id tanımlamasında güçlük çekilebilmektedir. Bu örnekte "id" ataması kontrolün eklenmesi ile oluşturuluyor.
using System;
using System.Collections.Generic;
namespace ConsoleApplication1.CreationalPatterns
{
class MainProgram
{
public static void Main()
{
FormControl AnaForm = new FormControl() { Id = "AnaForm" };
FormControl AraForm = new FormControl();
AnaForm.Controls.Add(AraForm);
AraForm.Controls.Add(new Button() { Text = "Btn1" });
AraForm.Controls.Add(new Button() { Text = "Btn2" });
Console.WriteLine("Ana form
kontrolleri");
AnaForm.Controls.ForEach(x => Console.WriteLine(x.Id));
Console.WriteLine("Ara form
kontrolleri");
AraForm.Controls.ForEach(x => Console.WriteLine(x.Id));
Console.ReadKey();
}
}
public class Field
{
public object Id { get; set; }
public string Name { get; set; }
}
public class BaseControl : Field
{
public BaseControl(){}
public IdMode IdMode { get; set; }
}
public enum IdMode { Dynamic, Static }
public class ControlCollection : List<BaseControl>
{
public FormControl control;
public ControlCollection(FormControl control)
{
this.control = control;
}
public ControlCollection() { }
public new void Add(BaseControl dtn)
{
if (dtn.IdMode == IdMode.Dynamic)
{
dtn.Id = control.Id + "_" + this.Count;
dtn.IdMode = IdMode.Static;
}
base.Add(dtn);
}
}
public class FormControl : BaseControl
{
public int DynamicTemplateId { get; set; }
public FormControl()
{
Controls = new ControlCollection(this);
}
public ControlCollection Controls { get; protected set; }
}
public class Button : BaseControl
{
public Button(){ }
public string Text { get; set; }
}
}