原理介绍:
工厂设计模式常用于根据输入参数的不同或者应用程序配置的不同来创建一种专门用来实例化并返回其对应的类的实例。
个人理解为:就像一个制造各种玩具的工厂,如果指示制作玩具车就制造玩具车,制作方法一样,具体实现不一样,通过指定参数的类型或数目来决定制造。
<?php
//定义一个接口,让类实现接口的规范,接口中定义的方法皆为抽象的,都需要实现
interface InterfaceShape
{
function getArea();
function getCircumference();
}
/**
* 矩形
*/
class Rectangle implements InterfaceShape
{
private $width;
private $height;
public function __construct($width, $height)
{
$this->width = $width;
$this->height = $height;
}
public function getArea()
{
return $this->width* $this->height;
}
public function getCircumference()
{
return 2 * $this->width + 2 * $this->height;
}
}
/**
* 圆形
*/
class Circle implements InterfaceShape
{
private $radius;
public function __construct($radius)
{
$this->radius = $radius;
}
public function getArea()
{
return M_PI * pow($this->radius, 2);
}
public function getCircumference()
{
return 2 * M_PI * $this->radius;
}
}
/**
* 形状工厂类
*/
class FactoryShape
{
//通过判断参数来判断创建哪个类
public static function create()
{
switch (func_num_args())
{
case 1://一个参数
return new Circle(func_get_arg(0));
break;
case 2://两个参数
return new Rectangle(func_get_arg(0), func_get_arg(1));
default:
echo "参数不正确";
break;
}
}
}
$rect =FactoryShape::create(5, 5);
// object(Rectangle)#1 (2) { ["width":"Rectangle":private]=> int(5) ["height":"Rectangle":private]=> int(5) }
var_dump($rect);
echo "<br>";
// object(Circle)#2 (1) { ["radius":"Circle":private]=> int(4) }
$circle =FactoryShape::create(4);
var_dump($circle);
?>
因为正在学习中,源码来源于网络,自己对原理进行了分析
工厂模式主要有三大块:
一个规范的接口:定义这个工厂的模板(类)实现的功能
几个实现功能的类:定义几个实现功能的
一个工厂类:根据参数类型和个数判断来实例化哪个类的类,直接定义一个静态方法,使这个工厂类无需实例化,即可以挑选创建哪个对象。