public Prog2()
    {
        var factory = new CommandFactory2();

        factory.Register("A", new Lazy <Action>(() => new A().DoA));
        factory.Register("B", new Lazy <Action>(() => new B().DoB));
        factory.Register("C", new Lazy <Action>(() => factory.DoStuff));
        factory.Execute("A");
    }
    public Prog2()
    {
        var factory = new CommandFactory2();

        factory.Register("A", new Lazy <Action>(() => new A().DoA));

        B        b  = null;
        Func <B> my = () => b ?? (b = new B());

        factory.Register("B", new Lazy <Action>(() =>
        {
            var v = my();
            return(v.DoB);
        }));
        factory.Register("C", new Lazy <Action>(() => factory.DoStuff));
        factory.Execute("A");
    }
    public Prog2()
    {
        var factory = new CommandFactory2();

        factory.Register("A", new Lazy <Command>(
                             () =>
        {
            var a = new A();
            return(new Command(a.DoA, a.UndoA));
        }));
        factory.Register("B", new Lazy <Command>(
                             () =>
        {
            var c = new B();
            return(new Command(c.DoB, c.DoB));
        }));
        factory.Register("C", new Lazy <Command>(
                             () => new Command(DoStuff, UndoStuff)));
        factory.Execute("A");
    }