Ein oftbenötigtes Pattern der OOP / OOD ist das Factorypattern.
Es ist in der Lage zur Initialisierung der Anwendung alle benötigten Objekte zur Verfügung zu stellen.
Klar braucht man für einfache Instantiierung keine Factorymethode.
Möchte man jedoch zur Laufzeit viele Objekte Instantiieren und weis man nichts über die Konstruktoren etc. Bietet sich eine Factoryklasse mit Einbindung der Reflectionmethoden der Reflektionklasse an. Das verhindert Probleme mit komplexen Konstruktoren.
Folgendes Beispiel erstellt Objekte anhand einer Liste. Dabei wird einer der Reflectionklassemethoden(getNumberOfRequiredParameters()) benutzt um die Instantiierungsparameter der Konstruktoren abzufangen. Zusätzlich wird für jedes Object eine Helpermethode aufgerufen, in der man das Objekt vorkonfigurieren kann.
Bitte beachten, dass die Sourcen dynamisch geladen werden. Die müssen natürlich existieren.
und die ERROR Klasse ist eine eingene Implementierung.
class factory {
function __construct()
{
$this->built;
}
private function built() {
$arr_Classnames = array(
'_error' =>'C_ERROR',
'_survey' =>'C_SURVEY',
'_company' =>'C_COMPANY',
'_layout' =>'C_LAYOUT'
);
C_ERROR::arrayEmpty(get_class()."::factory_Keys()","\$arr_Classnames",$arr_Classnames);
//durch die liste zu erstellender Objecte iterieren
foreach($arr_Classnames as $objname=>$class) {
require($className.".php");
$className=$class;
//wenn der Konstruktor Parameter braucht / ansonsten einfache Instatiierung
$reflectionMethods = new ReflectionMethod($className, '__construct');
if($reflectionMethods->getNumberOfRequiredParameters()>0) {
$_refClass = new ReflectionClass($className);
$this->$objname = $_refClass->newInstanceArgs(array($this));
}else {
$this->$objname = new $className;
}
//call helpermethode
$HelperFunction="factory".$objname;
if(is_object($this->$objname)) {
if(!method_exists($this,$HelperFunction)) {
C_ERROR::isFunction(get_class(),$HelperFunction);
}
}else {
C_ERROR::object(get_class()."::built()","\$this->$objname",$this->$objname);
}
}
}
}