工厂模式是一种隐藏类的实例化细节,并且对一系列类使用相同的实例化方式,可以很方便的扩展更多的实现同一个接口的类的创建对象的方式。
示例应用场景有:
1)在线支付
支付有多种方式,比如微信支付,支付宝支付,银联支付等,根据用户的选择而采用相应的支付方式;
2)访问量统计
在一个业务较复杂的项目中,用户对不同的对象进行访问,比如访问文章、访问作者、访问文章目录等,同样是访问记录,记录的信息却不一样
工厂模式的原理:
先根据多个对象的相同行为设计一个接口,再让这几个类去实现这个接口,接着制造一个实例化工厂,即可在工厂中根据不同参数实例化不同类。
工厂模式的具体实现:
/*
* 形状接口
*/
interface Shape
{
public function area();
}
/*
* 长方形类,实现了形状接口
*/
class Rectangle implements Shape
{
private $long;
private $width;
function __construct($long,$width)
{
$this->long = $long;
$this->width = $width;
}
/*
* 实现面积方法
*/
public function area()
{
// TODO: Implement area() method.
return $this->long * $this->width;
}
}
/*
* 正方形类,实现了形状接口
*/
class Square implements Shape
{
private $width;
function __construct($width)
{
$this->width = $width;
}
/*
* 实现面积方法
*/
public function area()
{
// TODO: Implement area() method.
return pow($this->width,2);
}
}
/*
* 圆形类,实现了形状接口
*/
class Circle implements Shape
{
private $radiu;
function __construct($radiu)
{
$this->radiu = $radiu;
}
/*
* 实现面积方法
*/
public function area()
{
// TODO: Implement area() method.
return pi()*pow($this->radiu,2);
}
}
class ShapeFactory
{
/*
* 获取实例化的形状对象
* ...$args 表示接受不限个数的参数
*/
public function getShpae(...$args)
{
/*
* 第一个参数为形状名,后面的参数为形状的尺寸
*/
switch($args[0])
{
case 'Rectangle':
return new Rectangle($args[1],$args[2]);
break;
case 'Square':
return new Square($args[1]);
break;
case 'Circle':
return new Circle($args[1]);
break;
}
return null;
}
}
$factory = new ShapeFactory();
$shape = $factory->getShpae('Rectangle',2,3);
$area[] = $shape->area();
$shape = $factory->getShpae('Square',2);
$area[] = $shape->area();
$shape = $factory->getShpae('Circle',2);
$area[] = $shape->area();
print_r($area);
/*
Array
(
[0] => 6
[1] => 4
[2] => 12.566370614359
)
*/