static void TestDucksQuacking()
        {
            var countingDuckFactory = new CountingDuckFactory();
            var duckFactory         = new DuckFactory();

            IQuackable mallarDuck;
            IQuackable duckCallDuck;
            IQuackable fakeDuckIsAGoose;
            IQuackable rubberDuck;
            IQuackable redheadDuck;

            var flock = new Flock();

            CreateDucks(countingDuckFactory, out mallarDuck, out duckCallDuck, out fakeDuckIsAGoose, out rubberDuck, out redheadDuck);

            flock.addQuackable(mallarDuck);
            flock.addQuackable(duckCallDuck);
            flock.addQuackable(fakeDuckIsAGoose);
            flock.addQuackable(rubberDuck);
            flock.addQuackable(redheadDuck);

            SimulateQuacks(redheadDuck, duckCallDuck, fakeDuckIsAGoose, mallarDuck, rubberDuck);

            flock.quack();

            Console.WriteLine("Number of Quacks: {0}", QuackCounter.getQuacks());

            CreateDucks(duckFactory, out mallarDuck, out duckCallDuck, out fakeDuckIsAGoose, out rubberDuck, out redheadDuck);

            flock.addQuackable(mallarDuck);
            flock.addQuackable(duckCallDuck);
            flock.addQuackable(fakeDuckIsAGoose);
            flock.addQuackable(rubberDuck);
            flock.addQuackable(redheadDuck);

            flock.quack();
            flock.quack();
            flock.quack();

            flock.quack();

            SimulateQuacks(redheadDuck, duckCallDuck, fakeDuckIsAGoose, mallarDuck, rubberDuck);

            Console.WriteLine("Number of Quacks: {0}", QuackCounter.getQuacks());

            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            var observer            = new Observer();
            var countingDuckFactory = new CountingDuckFactory();

            var mallarDuck = countingDuckFactory.createMallarDuck();
            //mallarDuck.addObserver(observer);

            var rubberDuck = countingDuckFactory.createRubberDuck();
            //rubberDuck.addObserver(observer);

            var redheadDuck = countingDuckFactory.createRedHeadDuck();
            //redheadDuck.addObserver(observer);

            var duckCallDuck = countingDuckFactory.createDuckCallDuck();
            //duckCallDuck.addObserver(observer);

            var fakeDuckIsAGoose = countingDuckFactory.createGooseDucky();
            //fakeDuckIsAGoose.addObserver(observer);

            //mallarDuck.quack();
            //rubberDuck.quack();
            //redheadDuck.quack();
            //duckCallDuck.quack();
            //fakeDuckIsAGoose.quack();

            var flock = new Flock();

            flock.addQuackable(mallarDuck);
            flock.addQuackable(duckCallDuck);
            flock.addQuackable(fakeDuckIsAGoose);
            flock.addQuackable(rubberDuck);
            flock.addQuackable(redheadDuck);
            //flock.addObserver(observer);
            flock.quack();



            Console.ReadKey();
        }
        static void TestDucksQuacking()
        {
            var countingDuckFactory = new CountingDuckFactory();
            var duckFactory = new DuckFactory();

            IQuackable mallarDuck;
            IQuackable duckCallDuck;
            IQuackable fakeDuckIsAGoose;
            IQuackable rubberDuck;
            IQuackable redheadDuck;

            var flock = new Flock();

            CreateDucks(countingDuckFactory, out mallarDuck, out duckCallDuck, out fakeDuckIsAGoose, out rubberDuck, out redheadDuck);

            flock.addQuackable(mallarDuck);
            flock.addQuackable(duckCallDuck);
            flock.addQuackable(fakeDuckIsAGoose);
            flock.addQuackable(rubberDuck);
            flock.addQuackable(redheadDuck);

            SimulateQuacks(redheadDuck, duckCallDuck, fakeDuckIsAGoose, mallarDuck, rubberDuck);

            flock.quack();

            Console.WriteLine("Number of Quacks: {0}", QuackCounter.getQuacks());

            CreateDucks(duckFactory, out mallarDuck, out duckCallDuck, out fakeDuckIsAGoose, out rubberDuck, out redheadDuck);

            flock.addQuackable(mallarDuck);
            flock.addQuackable(duckCallDuck);
            flock.addQuackable(fakeDuckIsAGoose);
            flock.addQuackable(rubberDuck);
            flock.addQuackable(redheadDuck);

            flock.quack();
            flock.quack();
            flock.quack();

            flock.quack();

            SimulateQuacks(redheadDuck, duckCallDuck, fakeDuckIsAGoose, mallarDuck, rubberDuck);

            Console.WriteLine("Number of Quacks: {0}", QuackCounter.getQuacks());

            Console.ReadKey();
        }
        static void Main(string[] args)
        {
            var observer = new Observer();
            var countingDuckFactory = new CountingDuckFactory();

            var mallarDuck = countingDuckFactory.createMallarDuck();
            //mallarDuck.addObserver(observer);

            var rubberDuck = countingDuckFactory.createRubberDuck();
            //rubberDuck.addObserver(observer);

            var redheadDuck = countingDuckFactory.createRedHeadDuck();
            //redheadDuck.addObserver(observer);

            var duckCallDuck = countingDuckFactory.createDuckCallDuck();
            //duckCallDuck.addObserver(observer);

            var fakeDuckIsAGoose = countingDuckFactory.createGooseDucky();
            //fakeDuckIsAGoose.addObserver(observer);

            //mallarDuck.quack();
            //rubberDuck.quack();
            //redheadDuck.quack();
            //duckCallDuck.quack();
            //fakeDuckIsAGoose.quack();

            var flock = new Flock();
            flock.addQuackable(mallarDuck);
            flock.addQuackable(duckCallDuck);
            flock.addQuackable(fakeDuckIsAGoose);
            flock.addQuackable(rubberDuck);
            flock.addQuackable(redheadDuck);
            //flock.addObserver(observer);
            flock.quack();

            Console.ReadKey();
        }