A factory class is a class specially used to create other objects. Factory classes are very important in the practice of polymorphic programming. It allows dynamic replacement of classes and modification of configurations, making the application more flexible. Mastering the factory pattern is essential for web development.
The factory pattern is usually used to return different classes similar to interfaces. A common use of factories is to create polymorphic providers.
Usually the factory pattern has a key construct, which is a static method generally named factory. This static method can accept any number of parameters and must return an object.
Program List: Basic factory class
class Fruit {
// Object is returned from the factory class
}
Class FruitFactory {
public static function factory() {
// Returns one of the objects New instance
return new Fruit();
}
}
// Call factory
$instance = FruitFactory::factory();
?>
Program List: Use factory class to produce objects
php
class Example
{
// The parameterized factory method
public static function factory($type)
{
if (include_once 'Drivers/' . $type . '.php') {
$classname = 'Driver_' . $type;
return new $classname; y('MySQL' );
// Load an SQLite Driver
$sqlite = Example::factory('SQLite');
?>
Program List: A complete factory class
The following program defines a general factory class , it produces an empty object that can save all your operations, and you can get an instance, and these operations are all in that instance.
/**
* Generic Factory class
*
* This Magic Factory will remember all operations you perform on it,
* and apply them to the object it instantiates.
*
*/
class FruitFactory {
private $history, $class, $constructor_args;
/**
* Create a factory of given class. Accepts extra arguments to be passed to
* class constructor.
*/
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' => 'call',
'method' => $method,
'args' => $args
);
}
function __set( $property, $value ) {
$this->history[] = array(
'action' => 'set',
'property' => $property,
'value' => $value
);
}
/**
* Creates an instance and performs all operations that were done on this MagicFactory
*/
function instance() {
# use Reflection to create a new instance, using the $args
$reflection_object = new ReflectionClass( $this->class );
$object = $reflection_object->newInstanceArgs( $this->constructor_args );
# Alternative method that doesn't use ReflectionClass, but doesn't support variable
# number of constructor parameters.
//$object = new $this->class();
# Repeat all remembered operations, apply to new object.
foreach( $this->history as $item ) {
if( $item['action'] == 'call' ) {
call_user_func_array( array( $object, $item['method'] ), $item['args'] );
}
if( $item['action'] == 'set' ) {
$object->{$item['property']} = $item['value'];
}
}
# Done
return $object;
}
}
class Fruit {
private $name, $color;
public $price;
function __construct( $name, $color ) {
$this->name = $name;
$this->color = $color;
}
function setName( $name ) {
$this->name = $name;
}
function introduce() {
print "Hello, this is an {$this->name} {$this->sirname}, its price is {$this -& gt; price} rmb. ";;
}}}
# setup a faction
$ Fruit_Factory = New FruitFactory ('FRUIT', 'Apple', 'Gonn'); -& gt; setname ('Apple' );
$fruit_factory->price = 2;
# Get an instance
$apple = $fruit_factory->instance();
$apple->introduce();
?>
The program runs Result:
The factory pattern mainly provides a transition interface for creating objects, so as to shield and isolate the specific process of creating objects to achieve the purpose of improving flexibility.
For more articles related to understanding PHP’s Factory Pattern, please pay attention to the PHP Chinese website!