<?php
declare(strict_types=1);

/**
 * 工厂方法:客户发出请求时,请求不同的工厂类(不同的工厂类实现同一一个工厂接口),
 * 由工厂类实例化不同的产品类(不同产品类实现同一个产品接口,并有各自的业务逻辑)
 */
interface Framework {
    public function getName();
}

class ThinkPHP implements Framework
{
    public function getName(): string
    {
        return 'ThinkPHP';
    }
}

class Laravel implements Framework
{
    public function getName(): string
    {
        return 'Laravel';
    }
}


interface Factory {
    public function getIns();
}

class ThinkPHPFactory implements Factory
{
    public function getIns(): Framework
    {
        return new ThinkPHP();
    }
}


class LaravelFactory implements Factory{
    public function getIns(): Framework
    {
        return new Laravel();
    }
}


class FactoryMethod
{
    public function getThink()
    {
        $thinkFactory = new ThinkPHPFactory();
        $think = $thinkFactory->getins();
        return $think->getName();
    }

    public function getLaravel()
    {
        $laravelFactory = new LaravelFactory();
        $laravel = $laravelFactory->getIns();
        return $laravel->getName();
    }
}

$fm = new FactoryMethod();
echo $fm->getThink(); // ThinkPHP
echo $fm->getLaravel(); // Laravel