php

设计模式--工厂模式

2019-01-24  本文已影响0人  ysp123

工厂模式的最大优点在于创建对象上面,就是把创建对象的过程封装起来,这样随时可以产生一个新的对象。减少代码进行复制粘帖,耦合关系重,牵一发动其他部分代码。
工厂模式的三种形式:
1、简单工厂模式

interface person{
    function eat();
    function drink();
}

class Woman implements person{

    function eat(){
        echo "woman 吃饭";
    }

    function drink(){
        echo "woman 喝水";
    }

}


class Man implements person{
    function eat(){
        echo "man 吃饭";
    }

    function drink(){
        echo "man 喝水";
    }
}

class Factory{
    function createObj($type){
        return new $type;
    }
}

$obj = new Factory();
$man = $obj->createObj('Man');
$man->eat();

$woman = $obj->createObj('Woman');
$woman->eat();

2、工厂模式

interface person{
    function eat();
    function drink();
}

class Woman implements person{

    function eat(){
        echo "woman 吃饭";
    }

    function drink(){
        echo "woman 喝水";
    }

}


class Man implements person{
    function eat(){
        echo "man 吃饭";
    }

    function drink(){
        echo "man 喝水";
    }
}

interface obj{
    function create();
}

class WomanObj implements obj{
    function create(){
        return new Woman();
    }
}

class ManObj implements obj{
    function create(){
        return new Man();
    }
}

class Factory{

    function getObj(){
        $woman = new WomanObj();
        $wobj = $woman->create();
        $wobj->eat();

        $Man = new ManObj();
        $Mobj = $Man->create();
        $Mobj->eat();
    } 
}

$obj = new Factory();
$obj->getObj();

3、抽象工厂

interface person{
    function eat();
    function drink();
}

class Woman implements person{

    function eat(){
        echo "woman  吃饭";
    }

    function drink(){
        echo "woman 喝水";
    }

}

class Iwoman implements person{
    function eat(){
        echo "内向 woman 吃饭 放不开";
    }

    function drink(){
        echo "内向 woman 喝水 放不开";
    }
}




class Man implements person{
    function eat(){
        echo "man 吃饭";
    }

    function drink(){
        echo "man 喝水";
    }
}

abstract class create{
    abstract public  function createObj();
    abstract public  function createIobj();
}

class Wobj extends create{
    public function createObj(){
        return new Woman();
    }

    public function createIobj(){
        return new Iwoman();
    }
}

$obj = new Wobj();
$woman = $obj->createObj();
$woman->eat();
echo "<br/>";
$woman = $obj->createIobj();
$woman->eat();

区别:
简单工厂模式:用来生产同一等级结构中的任意产品。对与增加新的产品,无能为力
工厂模式 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

简单工厂模式:工厂类负责创建的对象较少,客户只知道传入工厂类的参数,对于如何创建对象不关心。

工厂方法模式:当一个类不知道它所必须创建对象的类或一个类希望由子类来指定它所创建的对象时,当类将创建对象的职责委托给多个帮助子类中得某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候,可以使用工厂方法模式。

抽象工厂模式:一个系统不应当依赖于产品类实例何如被创建,组合和表达的细节,这对于所有形态的工厂模式都是重要的。这个系统有多于一个的产品族,而系统只消费其 中某一产品族。同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。系统提供一个产品类的库,所有的产品以同样的接口出现,从 而使客户端不依赖于实现。

不管何种方式,根据具体的业务来定,达到最大程度的代码复用。

上一篇 下一篇

猜你喜欢

热点阅读