概述
工厂设计模式作为一种创建型设计模式,即是创建某个产品。创建它的类向工厂发送请求,具体创建则由工厂来完成,由此达到产品与创建它的类松耦合的目的
简单工厂模式类图
简单的例子
参与者Creator类代码实例:
<?php
abstract class Creator
{
protected abstract factoryMethod();
public function startFactory()
{
$p = $this->factoryMethod();
return $p;
}
}
?>
具体工厂类实现代码:
<?php
include_once('Creator.php');
include_once('CatProduct.php');
class CatFactory extends Creator
{
protected function factoryMethod()
{
$product = new CatProduct();
return ($product->getProperties());
}
}
?>
<?php
include_once('Creator.php');
include_once('DogProduct.php');
class DogFactory extends Creator
{
protected function factoryMethod()
{
$product = new CatProduct();
return ($product->getProperties());
}
}
?>
Product类具体实现:
<?php
interface Product
{
public function getProperties();
}
?>
具体产品类实现代码:
<?php
include_once('Product.php');
class DogProduct implements Product
{
private $mfgProduct;
public function getProperties()
{
$this->mfgProduct = 'dog';
return $this->mfgProduct;
}
}
?>
<?php
include_once('Product.php');
class CatProduct implements Product
{
private $mfgProduct;
public function getProperties()
{
$this->mfgProduct = 'cat';
return $this->mfgProduct;
}
}
?>
客户端client具体实现代码
<?php
include_once('CatFactory.php'):
include_once('DogFactory.php'):
class Client
{
private catObject;
private dogObject;
public function _construct()
{
$this->catObject = new CatFactory()
echo $this->catObject->startFactory();
$this->dogObject = new DogFactory()
echo $this->dogObject->startFactory();
}
}
$worker = new Client();
?>
如上所述的简单工厂工厂模式中,一个工厂对应一个产品,若我需要建立新的产品,那么相应的工厂也需要增加,那么有什么办法只需一个工厂可以生产多个产品呢?答案是有的,那就是参数化工厂方法
参数化工厂设计实例
Creator代码示例
<?php
abstract class Creator
{
protected abstract factoryMethod(Product $product);
public function doFactory($productNow)
{
$p = $this->factoryMethod($productNow);
return $p;
}
}
?>
ConcreteFactory工厂类代码
<?php
include_once('Creator.php');
include_once('Product.php');
class ConcreteFactory extends Creator
{
private $p;
protected function factoryMethod(Product $product)
{
$p = $product;
return ($this->$p->getProperties());
}
}
?>
Product类具体实现:
<?php
interface Product
{
public function getProperties();
}
?>
具体产品类实现代码:
<?php
include_once('Product.php');
class DogProduct implements Product
{
private $mfgProduct;
public function getProperties()
{
$this->mfgProduct = 'dog';
return $this->mfgProduct;
}
}
?>
<?php
include_once('Product.php');
class CatProduct implements Product
{
private $mfgProduct;
public function getProperties()
{
$this->mfgProduct = 'cat';
return $this->mfgProduct;
}
}
?>
有参数客户端client具体实现代码
<?php
include_once('CatProduct.php'):
include_once('DogProduct.php'):
include_once('ConcreteFactory.php'):
class Client
{
private factory;
public function _construct()
{
$this->factory= new ConcreteFactory();
echo $this->factory->doFactory(new DogProduct());
echo $this->factory->doFactory(new CatProduct());
}
}
$worker = new Client();
?>
利用工厂模式,可以很方便的扩展新的产品,如示例代码:只要Product的getProperties()接口保持不变,在工厂方法设计中做任何改变或增补都不会导致破坏