1、模式定义
定义一个创建对象的接口,但是让子类去实例化具体类。工厂方法模式让类的实例化延迟到子类中。
创建一个抽象类,在抽象类下创建抽象方法,必须由子类去重写实现,
例如生产猫的玩具,
代码
/**工厂方法抽象类
* Class FactoryMethod
* @package app\lib\Method
*/
abstract class FactoryMethod
{
/**子类必须实现该方法
* @param $type
* @return mixed
*/
abstract public function create($type,$color);
}
可以创建A工厂,生产各种猫玩具。。。
可以创建B工厂,生产各种狗玩具。。。
可以创建C工厂,生产各种猪玩具。。。
继承工厂方法抽象类,每个工厂生产的不一样,必须重写他的create方法
/**A工厂,
* Class AFactory
* @package app\lib\Method
*/
class AFactory extends FactoryMethod
{
public function create($type,$color)
{
switch ($type) {
case 0:
$obj= new Shorthair();//短毛猫
break;
case 1:
$obj= new Persian();//波斯猫
break;
default:
$obj= new Domestic();//家猫
break;
}
$obj->setColor($color);
return $obj;
}
}
创建猫玩具接口
/**猫玩具的接口
* Interface CatInterface
* @package app\lib\Method
*/
interface CatInterface
{
/**设置猫的颜色
* @param $rgb
* @return mixed
*/
public function setColor($rgb);
}
具体产品
/**波斯猫
* Class Persian
* @package app\lib\Method
*/
class Persian implements CatInterface
{
private $color;
public function setColor($rgb)
{
$this->color=$rgb;
}
public function getColor()
{
return $this->color.'波斯猫';
}
}
/**短毛猫
* Class Shorthair
* @package app\lib\Method
*/
class Shorthair implements CatInterface
{
private $color;
public function setColor($rgb)
{
$this->color=$rgb;
}
public function getColor()
{
return $this->color."短毛猫";
}
}
/**家猫
* Class Domestic
* @package app\lib\Method
*/
class Domestic implements CatInterface
{
private $color;
public function setColor($rgb)
{
$this->color=$rgb;
}
public function getColor()
{
return $this->color.'家猫';
}
}
控制器调用
public function index(){
//我们不需要关心什么工厂,知道他可以生产猫就可以了
$factory=new AFactory();
//生产蓝色的波斯猫
$res= $factory->create(0,"蓝色");
var_dump($res->getColor());
}
网友评论