-
简单工厂模式(Simple Factory)
定义
简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
实例
<?php
class SimpleFactory
{
public function createBicycle(): Bicycle
{
return new Bicycle();
}
public function createCar(): Car
{
return new Car();
}
}
class Bicycle
{
public function driveTo(string $destination)
{
var_dump($destination);
}
}
class Car
{
public function driveTo(string $destination)
{
var_dump($destination);
}
}
$factory = new SimpleFactory();
$bicycle = $factory->createCar();
$bicycle->driveTo('XiaoMen');
//输出:string(7) "XiaoMen"
$bicycle = $factory->createBicycle();
$bicycle->driveTo('FuJian');
//输出:string(6) "FuJian"
?>
-
工厂方法模式 ( Factory Method)
概念
工厂方法模式 和 简单工厂模式非常接近,唯一不同的是,允许有多个工厂存在,相当于给工厂分组。
规则
- 每个工厂必须继承一个抽象类或接口类, 使之成为多态。
- 每个产品也必须继承一个抽象类或接口类,也使之成为多态。
- 每个工厂必须有一个工厂方法返回产品的实例。
实例
<?php
/**
* 工厂方法。由于简单工厂违背了开发-封闭原则
* 工厂方法。将这个改变放到了客户端
* copyright (c) http://blog.csdn.net/CleverCode
*/
// 运算抽象类
class Operation
{ /*{{{*/
// 数字A
protected $_numberA = null;
// 数字B
protected $_numberB = null;
/**
* 设置成员A
*
* @param double $num 数字
* @return void
*/
public function setNumberA($num){
$this->_numberA = $num;
}
/**
* 获取成员A
*
* @return double 数字
*/
public function getNumberA(){
return $this->_numberA;
}
/**
* 设置成员B
*
* @param double $num 数字
* @return void
*/
public function setNumberB($num){
$this->_numberB = $num;
}
/**
* 获取成员B
*
* @return double 数字
*/
public function getNumberB(){
return $this->_numberA;
}
/**
* 获取运算结果
*
* @return double 数字
*/
public function getResult(){
return null;
}
} /*}}}*/
// 加法类
class OperationAdd extends Operation
{ /*{{{*/
/**
* 获取运算结果
*
* @return double 数字
*/
public function getResult(){
return $this->_numberA + $this->_numberB;
}
} /*}}}*/
// 减法类
class OperationSub extends Operation
{ /*{{{*/
/**
* 获取运算结果
*
* @return double 数字
*/
public function getResult(){
return $this->_numberA - $this->_numberB;
}
} /*}}}*/
//运算工厂
interface IFactory
{/*{{{*/
public function createOperate();
}/*}}}*/
//加法工厂
class AddFactory implements IFactory
{/*{{{*/
public function createOperate()
{
return new OperationAdd();
}
}/*}}}*/
//减法工厂
class SubFactory implements IFactory
{/*{{{*/
public function createOperate()
{
return new OperationSub();
}
}/*}}}*/
class Client
{/*{{{*/
public static function main($a, $b)
{
//简单工厂的switch case 放到了客户端了
$factory = new AddFactory();
$add = $factory->createOperate();
// 设置数字A
$add->setNumberA($a);
// 设置数字B
$add->setNumberB($b);
// 运算
echo $add->getResult()."\r\n";
}
}/*}}}*/
Client::main(5,3);
//输出:8
?>
网友评论