public class DuckSimulator {
    public static void main(String[] args) {
        DuckSimulator simulator = new DuckSimulator();
        AbstractDuckFactory duckFactory = new CountingDuckFactory();
        simulator.simulate(duckFactory);
    }

    void simulate(AbstractDuckFactory duckFactory) {
        Quackable redheadDuck = duckFactory.createRedheadDuck();
        Quackable duckCall = duckFactory.createDuckCall();
        Quackable rubberDuck = duckFactory.createRubberDuck();
        Quackable gooseDuck = new GooseAdapter(new Goose());
        Flock flockOfDucks = new Flock();

        flockOfDucks.add(redheadDuck);
        flockOfDucks.add(duckCall);
        flockOfDucks.add(rubberDuck);
        flockOfDucks.add(gooseDuck);

        Flock flockOfMallards = new Flock();
        Quackable mallardOne = duckFactory.createMallardDuck();
        Quackable mallardTwo = duckFactory.createMallardDuck();
        flockOfMallards.add(mallardOne);
        flockOfMallards.add(mallardTwo);

        flockOfDucks.add(flockOfMallards);

        System.out.println("\\nDuck Simulator: With Observer");
        Quackologist quackologist = new Quackologist();
        flockOfDucks.registerObserver(quackologist);
        simulate(flockOfDucks);

        System.out.println("\\nThe ducks quacked " + QuackCounter.getQuacks() + " times");
    }

    void simulate(Quackable duck) {
        duck.quack();
    }
}

  1. public class DuckSimulator {
  2. public static void main(String[] args) { ... }
  3. DuckSimulator simulator = new DuckSimulator();
  4. AbstractDuckFactory duckFactory = new CountingDuckFactory();
  5. simulator.simulate(duckFactory);
  6. void simulate(AbstractDuckFactory duckFactory) { ... }
  7. Quackable redheadDuck = duckFactory.createRedheadDuck();
  8. Quackable duckCall = duckFactory.createDuckCall();
  9. Quackable rubberDuck = duckFactory.createRubberDuck();
  10. Quackable gooseDuck = new GooseAdapter(new Goose());
  1. Flock flockOfDucks = new Flock();
  2. flockOfDucks.add(redheadDuck); ... flockOfDucks.add(gooseDuck);
  3. Flock flockOfMallards = new Flock(); ... flockOfDucks.add(flockOfMallards);
  4. Quackologist quackologist = new Quackologist();
  5. flockOfDucks.registerObserver(quackologist);
  6. simulate(flockOfDucks);
  7. System.out.println("\\nThe ducks quacked " + QuackCounter.getQuacks() + " times");