Builder Pattern

<?php
  abstract class TagBuilderBase{
    //methods are POLYMORPHIC!!
    abstract function build_method_a();
    abstract function build_method_b();
    abstract function build_method_c();

    final function base_method(){
      echo "Processed : "  .  __METHOD__ ."</br>";
    }
  }
  class LinkTagBuilder extends TagBuilderBase{
    function __construct(){
      $this->base_method();
    }
    function build_method_a(){
      echo "Processed : "  .  __METHOD__ ."</br>";
    }
    function build_method_b(){
      echo "Processed : "  .  __METHOD__ ."</br>";
    }
    function build_method_c(){
      echo "Processed : "  .  __METHOD__ ."</br>";
    }
  }
  class ImageTagBuilder extends TagBuilderBase{
    function __construct(){
      $this->base_method();
    }
    function build_method_a(){
      echo "Processed : "  .  __METHOD__ ."</br>";
    }
    function build_method_b(){
      echo "Processed : "  .  __METHOD__ ."</br>";
    }
    function build_method_c(){
      echo "Processed : "  .  __METHOD__ ."</br>";
    }
  }
  
  class Controller{
    protected $builder;
    
    function __construct($builder){
      $this->builder = $builder;
    }
    
    function build(){
      //DELEGATE!!!
      $this->builder->build_method_a();
      $this->builder->build_method_b();
      $this->builder->build_method_c();
    }
  }
  
  class Main{
    static function creates_link_tag(){
      $link_tag_builder = new LinkTagBuilder();
      $controller = new Controller($link_tag_builder);
      $controller->build();
    }
    static function creates_image_tag(){
      $image_tag_builder = new ImageTagBuilder();
      $controller = new Controller($image_tag_builder);
      $controller->build();
    }
  }
  Main::creates_link_tag();
  Main::creates_image_tag();
?>