一、简单工厂模式

简单工厂模式又称为静态工厂方法模式,属于类的创建模式。通过传不同的参数实现不同类的实例化并返回实例化后的对象。

优点:对类进行统一实例化,当类名或类的参数变动时不用去全局查找并修改,只需工厂一处修改即可;如果使用到Interface,定义了一个公共类(Common)的话,所有实现的子类都有公共类中需要实现的方法(name);对类的调用方便,直接向工厂调用即可。

缺点:当需要创建的类越多越多时工厂类中的判断逻辑越来越多;新增类时需要修改代码添加逻辑,否则无法扩展。

<?php
 
interface Common
{
    // 定义一个接口, 让子类实现
    public function name();
}
 
class Class1 implements Common
{
    public function name(): string
    {
        return 'Class1' . '<br/>';
    }
}
 
class Class2 implements Common
{
    public function name(): string
    {
        return 'Class2' . '<br/>';
    }
}
// 工厂类
class simpleFactory
{
    public static function createObject(string $className): object
    {
        if (!empty($className) && class_exists($className)) {
            if ($className == 'Class1') {
                return new $className();
            } elseif ($className == 'Class2') {
                return new $className();
            }
        }
        return new \stdClass();
    }
}
// 调用工厂类中静态方法实现类的实例化
echo simpleFactory::createObject('Class1')->name();
echo simpleFactory::createObject('Class2')->name();

输出结果:

Class1
Class2

二、工厂方法模式

工厂方法模式是在简单工厂模式上的扩展,并加入了抽象。当增加类时,只需要增加一个工厂类的文件,在文件中实现抽象工厂中的方法,并实例化返回这个类独有的工厂类对象。这样使统的扩展性变得很好,符合面向对象编程的开闭原则。工厂方法模式把原来简单工厂模式中的createObject细节分开放到子类中去实现。

<?php
 
interface Common
{
    // 定义一个接口, 让子类实现
    public function name();
}
 
class Class1 implements Common
{
    public function name(): string
    {
        return 'Class1' . '<br/>';
    }
}
 
class Class2 implements Common
{
    public function name(): string
    {
        return 'Class2' . '<br/>';
    }
}
// 工厂方法类
abstract class methodFactory
{
    protected abstract static function createObject();
}
// 实现Class1工厂
class Class1Factory extends methodFactory{
    public static function createObject(): object
    {
        return new Class1();
    }
}
// 实现Class2工厂
class Class2Factory extends methodFactory{
    public static function createObject(): object
    {
        return new Class2();
    }
}
// 调用工厂方法
echo Class1Factory::createObject()->name();
echo Class2Factory::createObject()->name();

输出结果:

Class1
Class2

三、抽象工厂模式

抽象工厂模式是在工厂方法模式上的扩充,支持多个工厂的抽象方法的实现。将多个类统一到一个工厂中实现。当再增加一个抽象工厂(abstractFactory)中要实现的方法时,需要修改(abstractFactory)类和实现工厂类的子类代码。增加了工厂类的抽象性和理解难度。

<?php
 
interface Class1
{
    // 定义一个接口, 让子类实现
    public function name();
}
 
class ClassA implements Class1
{
    public function name(): string
    {
        return 'ClassA name' . '<br/>';
    }
}
 
class ClassB implements Class1
{
    public function name(): string
    {
        return 'ClassB name' . '<br/>';
    }
}
 
 
interface Class2
{
    // 定义一个接口, 让子类实现
    public function type();
}
 
class ClassC implements Class2
{
    public function type(): string
    {
        return 'ClassC type' . '<br/>';
    }
}
 
class ClassD implements Class2
{
    public function type(): string
    {
        return 'ClassD type' . '<br/>';
    }
}
// 工厂方法类
abstract class abstractFactory
{
    protected abstract static function createObjectName();
    protected abstract static function createObjectType();
}
class Obj1Factory extends abstractFactory{
    public static function createObjectName(): object
    {
        return new ClassA();
    }
 
    public static function createObjectType(): object
    {
        return new ClassC();
    }
}
class Obj2Factory extends abstractFactory{
    public static function createObjectName(): object
    {
        return new ClassB();
    }
 
    public static function createObjectType(): object
    {
        return new ClassD();
    }
}
echo Obj1Factory::createObjectName()->name();
echo Obj1Factory::createObjectType()->type();
 
echo Obj2Factory::createObjectName()->name();
echo Obj2Factory::createObjectType()->type();
ClassA name
ClassC type
ClassB name
ClassD type