1.简单工厂模式(Simple Factory)
<?php
//抽象产品角色
interface Car
{
public function drive();
}
//具体产品角色
class Benz implements Car
{
public function __construct()
{
echo 'Benz <br/>';
}
public function drive(){}
}
class BMW implements Car
{
public function __construct()
{
echo 'BMW <br/>';
}
public function drive(){}
}
class Audi implements Car
{
public function __construct()
{
echo 'Audi <br/>';
}
public function drive(){}
}
//工厂类角色
class Driver
{
public static function create($car)
{
//这里有业务逻辑的判断
if($car == 'Audi'){
return new Audi();
}else if($car == 'BMW'){
return new BMW();
}else if($car == 'Benz'){
return new Benz();
}
}
}
$a = Driver::create('Audi');
$b = Driver::create('BMW');
$c = Driver::create('Benz');
http://www.cnblogs.com/lori/archive/2012/06/24/2560059.html
2.工厂方法(Factory Method)
http://www.cnblogs.com/li-peng/archive/2013/02/17/2913568.html
由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
所谓的决定并不是批模式允许子类本身在运行时做决定,而是指在编写创建者类时,不需知道创建的产品是哪一下,选择了使用
哪个子类,就决定了实际创建的产品是什么。
<?php
//抽象产品角色
interface Car
{
public function drive();
}
//具体产品角色
class Benz implements Car
{
public function __construct()
{
echo 'Benz <br/>';
}
public function drive(){
var_dump(__CLASS__);
}
}
class BMW implements Car
{
public function __construct()
{
echo 'BMW <br/>';
}
public function drive(){
var_dump(__CLASS__);
}
}
class Audi implements Car
{
public function __construct()
{
echo 'Audi <br/>';
}
public function drive(){
var_dump(__CLASS__);
}
}
//抽象工厂角色
interface ABSDriver
{
public function absdrive();
}
//具体工厂角色
class BenzDriver implements ABSDriver
{
public function absdrive()
{
return new Benz();
}
}
class BMWDriver implements ABSDriver
{
public function absdrive()
{
return new BMW();
}
}
class AudiDriver implements ABSDriver
{
public function absdrive()
{
return new Audi();
}
}
$a = new BMWDriver();
$car = $a->absdrive();
echo $car->drive();
3.抽象工厂模式
<?php
//两个抽象产品,水果,蔬菜
//水果
interface Fruit
{
}
//蔬菜
interface Vegetable
{
}
//四种具体产品:北方水果,热带水果,北方蔬菜,热带蔬菜
class NorthernFruit implements Fruit
{
private $name;
public function __construct()
{
echo $this->$name = '北方水果<br/>';
}
}
class TropicalFruit implements Fruit
{
private $name;
public function __construct()
{
echo $this->$name = '热带水果<br/>';
}
}
class NorthernVeggie implements Vegetable
{
private $name;
public function __construct()
{
echo $this->$name = '北方蔬菜<br/>';
}
}
class TropicalVeggie implements Vegetable
{
private $name;
public function __construct()
{
echo $this->$name = '热带蔬菜<br/>';
}
}
//抽象工厂角色
interface Gardener
{
public function createFruit();
public function createVeggie();
}
//具体工厂角色:北方工厂,热带角色
class NorthernGardener implements Gardener
{
public function createFruit()
{
return new NorthernFruit();
}
public function createVeggie()
{
return new NorthernVeggie();
}
}
class TropicalGardener implements Gardener
{
public function createFruit()
{
return new TropicalFruit();
}
public function createVeggie()
{
return new TropicalVeggie();
}
}
http://blog.sina.com.cn/s/blog_b35e31b90101glhs.html
http://www.cnblogs.com/wangtao_20/p/3594192.html
http://laughingchs.iteye.com/blog/1169986
最重要的区别是:
工厂方法:一个具体工厂类只能创建一个产品;
抽象工厂:一个具体工厂类能创建多个产品,即一个产品族;