2. 3种工厂模式

这里写图片描述
这里写图片描述


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

这里写图片描述

http://baike.baidu.com/link?url=U5yzbzAKQg9iO8G38BMmrVnMp6HFxip7k–mrh41se_O5OFNRx8aMsDnLwEg4c52egxwnQJsU16YF8wsVcTVpq#3

最重要的区别是:
工厂方法:一个具体工厂类只能创建一个产品;
抽象工厂:一个具体工厂类能创建多个产品,即一个产品族;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值