<?php

class Director {

    public function buildDevice (DeviceBuilder $builder) {

        $builder->createDevice();
        $builder->setHardware();
        $builder->setSoftware();
        $builder->setupSLA();

        return $builder->getDevice();
    }
}


interface DeviceBuilder {

    public function setHardware ();

    public function setSoftware ();

    public function setupSLA ();

    public function createDevice ();

    public function getDevice ();

}

class InteractiveMirror {

    public $hardware = [];
    public $software = '';
    public $sla = '';

}

class InteractiveMirrorBuilder implements DeviceBuilder {

    private $device;

    public function setHardware () {
        $components = ['display', 'glass', 'PC', 'frame'];

        foreach ($components as $component) {
            $this->device->hardware[] = $component;
        }
    }

    public function setSoftware () {
        $this->device->software = 'Mirror software';
    }

    public function setupSLA () {
        $this->device->sla = 'Mirror SLA V2';
    }

    public function createDevice () {
        $this->device = new InteractiveMirror();
    }

    public function getDevice () {
        return $this->device;
    }
}

$mirrorBuilder = new InteractiveMirrorBuilder();
$director = new Director();
$mirror = $director->buildDevice($mirrorBuilder);

var_dump($mirror);