Skip to content

工厂模式也是一种创建模式,主要解决的是接口的选择问题,它提供了一种创建对象的最佳方式,其特点是不会对外界暴露过多的创建逻辑,而是使用一个共同的接口来自指向新创建的对象。

工厂模式的使用场景为,当你明确在不同条件下需要创建不同对象的时候你就应该尝试使用工厂模式了。

工厂模式有非常显著的优点: 其一,调用者只需要知道一个名称就可以创建一个对象。 其二,工厂类的扩展性非常高,当需要增加一个产品时,只需要扩展一个工厂类就能够实现。其三,调用者只需要关心对象的接口,而不用关心其具体的实现。

当然工厂模式也有非常大的缺点: 其一,每增加一个产品时,都需要增加一个具体类和对象实现工厂,这使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

php

//接口
interface ApptEncode()
{
    public function encode();
}

//接口实现 1
class MegaApptEncode implements ApptEncode
{
    public function encode()
    {
        echo "mega encode";
    }
}

//接口实现 2
class BloggsApptEncode implements ApptEncode
{
    public function encode()
    {
        echo "blog encode";
    }
}

//对象创建工厂(一般实现方法)
class Factory
{
    public function getEncode($encode)
    {
        if($encode=="apt"){
            return new MegaApptEncode();
        }

        if($encode=="mega"){
            return new BloggsApptEncode();
        }
    }
}

//基于反射机制的实现
class Factory
{
    public function getEncode($encode)
    {
        try{
            $instance = ReflectionClass($encode);
            return $instance -> newINstance();
        }catch(Exception $e){
            throw new Exception($e->message);
        }
    }
}

//方法调用
class Demo
{
    public function make()
    {
        $encode = (new Factory())->getEncode('apt');
        $encode -> encode();
        $encode = (new Factory())->getEncode('mega');
        $encode -> encode();
    }
}