简单工厂模式组成:
- 工厂类 :根据类型实例化具体服务者
- 抽象服务者父类:具体服务者的父类,规定提供的服务
- 具体服务者:真正的服务者
业务中时常会遇到类似于卖汽车的场景,一家4s店售卖多种类型的汽车,客户来买车,需要根据客户需求提给客户不同的车。
<?php
include('init.php');
//汽车工厂类
class CarFactory
{
public function createCar($carType)
{
switch ($carType)
{
case "BMW":
$car = new Bmw();
break;
case "Tesla":
$car = new Tesla();
break;
default:
$car = new SanLun();
}
return $car;
}
}
//汽车抽象类
abstract class Car
{
abstract function run();
}
//宝马
class Bmw extends Car
{
public function run()
{
echo "宝马就是快!\n";
}
}
//特斯拉
class Tesla extends Car
{
public function run()
{
echo "特斯拉电动车!\n";
}
}
//三轮
class SanLun extends Car
{
public function run()
{
echo "小小三轮,无敌风火轮!\n";
}
}
class CarStore
{
public function BuyCar($type)
{
$carFactory = new CarFactory();
$car = $carFactory->createCar($type);
$car->run();
}
}
$test = new CarStore();
$test->BuyCar("sanlun");
?>
优点
1、简单工厂模式实现了对责任的分割,提供了专门的工厂类用于创建对象。
2、客户端无须知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可,对于一些复杂的类名,通过简单工厂模式可以减少使用者的记忆量。
3、通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。
缺点
1、由于工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
2、使用简单工厂模式将会增加系统中类的个数,在一定程序上增加了系统的复杂度和理解难度。
3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,在产品类型较多时,有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
4、简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。