工厂模式是最常用的设计模式之一,是一样创建型设计模式。是创建对象的最佳方式,客户端可以不用知道具体对象的情况下,实例化对象。
有三种工厂模式
- 简单工厂模式
- 工厂模式
- 抽象工厂模式
这里我们先学习介绍简单工厂
简单工厂模式
定义一个工厂类,可以通过不同的参数返回不同的类的实例。
优点:
- 客户端只需知道参数即可,无需知道创建实例的具体类名;
- 可以在不修改客户端的情况下,修改类名。
缺点:
- 违反单一职责原则,一个类承担多个职责,随着手机品牌增多,会变的原来越难以维护;
- 违反开闭原则,如果修改一旦出现错误,可能造成整个系统崩溃;
具体代码实现
你可以在我的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);
}
}