简单工厂模式就是用一个类方法或者函数根据输入的参数来实例化不同对象返回给调用者。通常来说,这些不同的实例应该具有共同的父类或者共同的接口,这样才能保证调用者使用的是统一的对象类型。
/**
*抽象产品类
*/
abstract class AbstractProduct{
private $price;
public function __construct($price){
$this->price = $price;
}
protected function getPrice(){
return $this->price;
}
abstract protected function calculatePrice();//定义抽象方法
}
/**
*带折扣的产品类
*/
class ConcreteProduct1 extends AbstractProduct{
private $discount; //折扣
/**
*覆盖父类的构造方法
*/
public function __construct($price, $discount){
parent::__construct($price);
$this->discount = $discount;
}
/**
*实现父类的抽象方法
*/
public function calculatePrice(){
return $this->getPrice()*$this->discount;
}
}
/**
*普通产品类
*/
class ConcreteProduct2 extends AbstractProduct{
/**
*实现父类的抽象方法
*/
public function calculatePrice(){
return $this->getPrice()-200;
}
}
/**
*简单工厂类
*/
class SimpleFactory{
/**
*使用静态方法来生产实例
*/
static public function createProduct($flag){
switch($flag){
case 1: return new ConcreteProduct1(2333, 0.8);
case 2: return new ConcreteProduct2(2333);
}
}
}
$discountProduct = SimpleFactory::createProduct(1);
echo 'Discount product price is '.$discountProduct->calculatePrice().'<br>';
$commonProduct = SimpleFactory::createProduct(2);
echo 'Common product price is '.$commonProduct->calculatePrice().'<br>';
这种用静态方法实现的工厂又叫静态工厂,其优点是可以不用实例化工厂对象,从而节约开销;然而缺点是它的工厂方法不可以被继承,无法向下扩展。