public class Chicken : IBird
return new Egg(() => new Chicken());
private Func<IBird> hatchBirdFunc;
private bool hasHatched = false;
public Egg(Func<IBird> createBird)
hatchBirdFunc = createBird;
return hatchBirdFunc.Invoke();
throw new InvalidOperationException();
public static void Main(string[] args)
var chicken1 = new Chicken();
var egg = chicken1.Lay();
var childChicken = egg.Hatch();
var childChicken2 = egg.Hatch();