前言:工厂系列模式都是为了代码的解耦。
简单工厂模式通过一个参数名,去生成一个对象。实现第三方管理对象。避免在类中重复调用带来的维护成本。
在简单工厂中,用于创建对象的方法是静态方法,因此也被称作‘静态工厂’。
缺点:每新增一个产品类,都需要到工厂中修改代码。违反了开闭原则。
UML图如下
结构:
1:factory(工厂):核心部分,负责创建对象。
2:product(抽象产品类):负责定义公共方法。
3:concreteProduct(具体产品类):继承自抽象产品类,是被工厂创建的具体对象。
例子:例如买奶茶,奶茶店会提供我们不同的饮品。那么奶茶店就是工厂类,每种饮品就是具体的产品对象。
代码实现
// 饮料接口
public interface beverage
{
public function getName();
}
// 具体产品
class CoconutMilkTea implements beverage
{
private $name = '椰果奶茶';
public function getName()
{
return $this->name;
}
}
// 工厂类
class Factory
{
// 传入类名
public static function createBeverage($className)
{
$classObj = null;
if ($className == 'CoconutMilkTea') {
$classObj = new CoconutMilkTea();
}
// ... 其他产品
return $classObj;
}
}
// 客户端代码
class client
{
public function buyBeverage()
{
$beverageObj = Factory::createBeverage('CoconutMilkTea');
$name = $beverageObj->getName();
echo "您买了一杯 {$name}";
}
}