工厂模式之简单工厂模式(静态工厂模式)-创建型

在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类(接口)。

具有产品接口、产品实现、工厂实现。没有工厂接口。

简单工厂模式用于生产静态或独立的产品。

优点

  • 将对象的创建和对象本身业务处理分离可以降低系统的耦合度,使得两者修改起来都相对容易

  • 在调用工厂类的工厂方法时,使用起来方便,如果工厂方法是静态方法,可通过类名直接调用。或者只需要传入简单的参数即可。在实际开发中,还可以在调用时将所传入的参数保存在配置文件中,修改参数时无须修改任何源代码

缺点

  • 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

  • 工厂类的职责相对过重,增加新的产品需要修改工厂类的判断逻辑,或者增加一个静态方法,或者增加一个参数,这一点与开闭原则是相违背的。

适用

  • 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。

  • 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。

应用

JDK 加密算法

MessageDigest md = MessageDigest.getInstance("MD5");

示例

零件工厂 PartFactory 负责返回具体零件产品(发动机Engine、车轮Wheel)的实例。

零件有个统一的接口,和一个统一的方法 produce()

<?php
/**
 * Interface Part
 */
interface Part
{
    public function produce();
}

/**
 * Class Engine
 */
class Engine implements Part
{
    public function produce()
    {
        echo '生产发动机';
        echo PHP_EOL;
    }
}

/**
 * Class Wheel
 */
class Wheel implements Part
{
    public function produce()
    {
        echo '生产车轮';
        echo PHP_EOL;
    }
}

/**
 * Class PartFactory
 */
class PartFactory
{
    public function part($class)
    {
        switch($class){
            case 'Wheel':
                return new Wheel();
            case 'Engine':
                return new Engine();
        }
    }
}

/**
 * Class PartStaticFactory
 */
abstract class PartStaticFactory
{
    public static function Wheel()
    {
        return new Wheel();
    }

    public static function Engine()
    {
        return new Engine();
    }
}

$buttonFactory = new PartFactory();
$buttonFactory->part('Wheel')->produce();
$buttonFactory->part('Engine')->produce();

PartStaticFactory::Wheel()->produce();
PartStaticFactory::Engine()->produce();

输出:

生产车轮
生产发动机
生产车轮
生产发动机