Factory-Klasse ist eine Klasse, die speziell zum Erstellen anderer Objekte verwendet wird. Die Factory-Klasse ist in der Praxis der polymorphen Programmierung sehr wichtig. Es ermöglicht den dynamischen Austausch von Klassen und die Änderung von Konfigurationen, wodurch die Anwendung flexibler wird. Die Beherrschung des Fabrikmusters ist für die Webentwicklung unerlässlich.
Das Fabrikmuster wird normalerweise verwendet, um verschiedene Klassen zurückzugeben, die Schnittstellen ähneln. Eine häufige Verwendung von Fabriken besteht darin, polymorphe Anbieter zu erstellen.
Normalerweise verfügt das Factory-Muster über ein Schlüsselkonstrukt, bei dem es sich um eine statische Methode handelt, die normalerweise Factory genannt wird. Diese statische Methode kann beliebig viele Parameter akzeptieren und muss ein Objekt zurückgeben.
Programmliste: Grundlegende Fabrikklasse
Klasse Fruit {
// Von der Fabrikklasse zurückgegebenes Objekt
}
Klasse FruitFactory {
public static functionfactory() {
// Eine neue Instanz des Objekts zurückgeben
return new Fruit();
}
}
/ / Rufen Sie die Fabrik auf
$instance = FruitFactory::factory();
?>
Programmliste: Verwenden Sie die Fabrikklasse, um Objekte zu produzieren
< ?php
Klassenbeispiel
{
// Die parametrisierte Factory-Methode
öffentliche statische Funktion Factory($type)
{
if (include_once 'Drivers/' . $type . ' .php' ) {
$sqlite = Beispiel::factory( 'SQLite');
?>
Programmliste: Eine vollständige Factory-Klasse
Das folgende Programm definiert einen General Factory-Klasse, die Produkte erzeugt, die Ihre speichern können. Ein leeres Objekt für alle Vorgänge, Sie können eine Instanz erhalten, und diese Vorgänge befinden sich in dieser Instanz.
/**
* Generische Factory-Klasse
*
* Diese Magic Factory merkt sich alle Operationen, die Sie daran ausführen,
* und wendet sie auf das Objekt an, das sie instanziiert.
*
*/
class FruitFactory {
private $history, $class, $constructor_args;
/**
* Erstellen Sie eine Factory einer bestimmten Klasse. Akzeptiert zusätzliche Argumente, die an den Klassenkonstruktor
* übergeben werden.
*/
function __construct( $class ) {
$args = func_get_args();
$this->class = $class;
$this->constructor_ args = array_slice( $ args, 1 );
}
function __call( $method, $args ) {
$this->history[] = array(
'action' => 'Anruf ',
'method' => $method,
'args' => $args
}
function __set( $property, $value ) {
$this->history[] = array(
'action' => 'set',
'property' => $property,
'Wert' =>
);
}
/**
* Erstellt eine Instanz und führt alle Vorgänge aus, die auf dieser MagicFactory durchgeführt wurden
*/
Funktionsinstanz() {
# Verwenden Sie Reflection, um eine neue Instanz zu erstellen gs
$reflection_object = new ReflectionClass( $this->class );
$object = $reflection_object->newInstanceArgs( $this->constructor_args );
# Alternative Methode, die ReflectionClass nicht verwendet, aber keine Variable unterstützt
# Anzahl der Konstruktorparameter.
//$object = new $this->class();
# Alle gespeicherten Vorgänge wiederholen und auf neues Objekt anwenden.
foreach( $this->history as $item ) {
if( $item['action'] == 'call' ) {
call_user_func_array( array( $object, $item['method'] ), $item['args'] );
}
if( $item['action'] == 'setzen' ) {
$object->{$item['property']} = $item['value'];
# Fertig
$object zurückgeben ;
( $name, $color ) {
$this->name = $name;
$this->color = $color;
}
function setName( $name ) {
$ this->name = $name; }, der Preis beträgt {$this->price} RMB = new FruitFactory('Fruit', 'Apple', 'Gonn');
$fruit_factory->setName('Apple');
$fruit_factory->price = 2;
# Holen Sie sich eine Instanz
$apple = $fruit_factory->instance();
$apple->introduce();
?>
Ergebnis der Programmausführung:
Hallo, das ist ein Apple, der Preis beträgt 2 RMB.
Das Factory-Muster stellt hauptsächlich eine Übergangsschnittstelle zum Erstellen von Objekten bereit, um den spezifischen Prozess abzuschirmen und zu isolieren Erstellen von Objekten, um den Zweck der Verbesserung der Flexibilität zu erreichen.
Fabrikmuster können in drei Kategorien unterteilt werden:
Einfache Fabrik (Einfache Fabrik)
Fabrikmethode (Fabrikmethode)