static void MethodA()
        {
            ProductFactory productFactory = new ProductFactory();
            WrapFactory    wrapFactory    = new WrapFactory();

            // 直接调用
            Box boxA = wrapFactory.WrapBox(productFactory.MakePizza);
            Box boxB = wrapFactory.WrapBox(productFactory.MakePen);
            Box boxC = wrapFactory.WrapBox(productFactory.MakeToyCar);

            Console.WriteLine(boxA.Prouduct.Name);
            Console.WriteLine(boxB.Prouduct.Name);
            Console.WriteLine(boxC.Prouduct.Name);
        }
        static void MethodB()
        {
            ProductFactory productFactory = new ProductFactory();
            WrapFactory    wrapFactory    = new WrapFactory();

            // 间接调用
            Func <Product> makePizza  = new Func <Product>(productFactory.MakePizza);
            Func <Product> makePen    = new Func <Product>(productFactory.MakePen);
            Func <Product> makeToyCar = new Func <Product>(productFactory.MakeToyCar);

            Box boxA = wrapFactory.WrapBox(makePizza);
            Box boxB = wrapFactory.WrapBox(makePen);
            Box boxC = wrapFactory.WrapBox(makeToyCar);

            Console.WriteLine(boxA.Prouduct.Name);
            Console.WriteLine(boxB.Prouduct.Name);
            Console.WriteLine(boxC.Prouduct.Name);
        }
        static void Main(string[] args)
        {
            ProductFactory productFactory = new ProductFactory();
            WrapFactory    wrapFactory    = new WrapFactory();

            // 间接调用
            Func <Product> makePizza  = new Func <Product>(productFactory.MakePizza);
            Func <Product> makePen    = new Func <Product>(productFactory.MakePen);
            Func <Product> makeToyCar = new Func <Product>(productFactory.MakeToyCar);

            Logger           logger = new Logger();
            Action <Product> log    = new Action <Product>(logger.Log);

            Box boxA = wrapFactory.WrapBox(makePizza, log);
            Box boxB = wrapFactory.WrapBox(makePen, log);
            Box boxC = wrapFactory.WrapBox(makeToyCar, log);

            Console.WriteLine(boxA.Prouduct.Name);
            Console.WriteLine(boxB.Prouduct.Name);
            Console.WriteLine(boxC.Prouduct.Name);

            Console.ReadKey();
        }