工厂模式是最常用的设计模式之一,是一样创建型设计模式。是创建对象的最佳方式,客户端可以不用知道具体对象的情况下,实例化对象。
有三种工厂模式
这里我们先学习介绍简单工厂
定义一个工厂类,可以通过不同的参数返回不同的类的实例。
具体代码实现
你可以在我的github上下载代码
工厂类
SimpleFactory.php
<?php
namespace App\Creational\SimpleFactory;
class SimpleFactory
{
    static public function createPhone($brand)
    {
        switch ($brand) {
            case ‘Xiaomi‘:
                return new Xiaomi();
                break;
            case ‘Huawei‘:
                return new Huawei();
                break;
            case ‘Iphone‘:
                return new Iphone();
                break;
            default:
                return new Shanzhaiji();
        }
    }
}
定义一个手机接口,具有播放音乐和播放视频功能
Phone.php
<?php
namespace App\Creational\SimpleFactory;
interface Phone
{
    public function playMusic();
    public function playVideo();
}
IPhone手机类
Iphone.php
<?php
namespace App\Creational\SimpleFactory;
class Iphone implements Phone
{
    public function playVideo()
    {
        // TODO: Implement playVideo() method.
    }
    public function playMusic()
    {
        // TODO: Implement playMusic() method.
    }
}
华为手机类
Huawei.php
<?php
namespace App\Creational\SimpleFactory;
class Huawei implements Phone
{
    public function playMusic()
    {
        // TODO: Implement playMusic() method.
    }
    public function playVideo()
    {
        // TODO: Implement playVideo() method.
    }
}
小米手机类
Xiaomi.php
<?php
namespace App\Creational\SimpleFactory;
class Xiaomi implements Phone
{
    public function playMusic()
    {
        // TODO: Implement playMusic() method.
    }
    public function playVideo()
    {
        // TODO: Implement playVideo() method.
    }
}
<?php
/**
 * 简单工厂测试
 */
include __DIR__.‘/../vendor/autoload.php‘;
use PHPUnit\Framework\TestCase;
use App\Creational\SimpleFactory\SimpleFactory;
class SimpleFactoryTest extends TestCase
{
    public function testCanCreateBicycle()
    {
        $phone = SimpleFactory::createPhone(‘Xiaomi‘);
        $this->assertInstanceOf(\App\Creational\SimpleFactory\Phone::class, $phone);
    }
}
原文:https://www.cnblogs.com/ouguangqiang/p/14209390.html