Ну, я думаю, вы могли бы использовать контейнер IoC, поскольку некоторые из них также предлагают ObjectFactory, т.е. вы говорите IoC, как создать новый экземпляр типа T, а затем просто просите IoC дать вам его экземпляр .
Однако, если вы не хотите получать IoC, вы можете сделать себя немного заводским классом
public MagicFactory
{
T arg1, T2 arg2, T3 arg3,.., TN argN;
public MagicFactory(T1 a1,..., TN aN)
{
this.arg1=a1;
...
this.argN = an;
}
public Thing GimmeDaThing()
{
return new Thing(this.arg1,...,this.argN);
}
}
однако имейте в виду, что если аргументы не являются типом значения, то все ваши экземпляры Thing
будут иметь ссылки на одни и те же объекты, поэтому, даже если у вас разные экземпляры вещей, они все будут указывать то же самое arg1. Чтобы исправить это, нужно на самом деле получить Func в параметре, чтобы вы могли создать новый:
public MagicFactory
{
Func<T1> arg1, ,.., Func<TN> argN;
public MagicFactory(Func<T1> a1,..., Func<TN> aN)
{
this.arg1=a1;
...
this.argN = an;
}
public Thing GimmeDaThing()
{
return new Thing(this.arg1(),...,this.argN());
}
}
и вы бы назвали это так:
var magicContainer = new MagicFactory(()=> new T1(...),..., ()=>new T2(..);
var thing1 = magicContainer.GimmeDaThing();
var thing1 = magicContainer.GimmeDaThing();
var thing1 = magicContainer.GimmeDaThing();
var thing1 = magicContainer.GimmeDaThing();
и каждый раз вы будете получать новый экземпляр Thing, каждый со своими собственными объектами свойств.