<?php
//工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类的步骤。
class CD{
    public $title = '';
    public $band = '';
    public $tracks = [];

    public function __construct(){

    }

    public function setTitle($title){
        $this->title = $title;
    }

    public function setBand($band){
        $this->band = $band;
    }

    public function addTrack($track){
        $this->tracks[] = $track;
    }
}

$title = 'Waste of a Rib';
$band = 'Never Again';
$tracksFromExternalSource = ['What It Means', 'Brrr', 'Goodbye'];

$cd = new CD();
$cd->setTitle($title);
$cd->setBand($band);
foreach($tracksFromExternalSource as $track){
    $cd->addTrack($track);
}
print_r($cd->tracks);

echo PHP_EOL;

class enhancedCD{
    public $title = '';
    public $band = '';
    public $tracks = [];

    public function __construct(){
        $this->tracks[] = 'DATA TRACK';
    }

    public function setTitle($title){
        $this->title = $title;
    }

    public function setBand($band){
        $this->band = $band;
    }

    public function addTrack($track){
        $this->tracks[] = $track;
    }
}

class CDFactory{
    public static function create($type){
        $class = strtolower($type).'CD';
        return new $class;
    }
}

$type = 'enhanced';
$cd = CDFactory::create($type);
$cd->setBand($band);
$cd->setTitle($title);
foreach($tracksFromExternalSource as $track){
    $cd->addTrack($track);
}
print_r($cd->tracks);