栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > PHP

php工厂模式

PHP 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

php工厂模式

一、简单工厂模式

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

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

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

';
    }
}

class Class2 implements Common
{
    public function name(): string
    {
        return 'Class2' . '
';     } }
// 工厂类
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细节分开放到子类中去实现。

';
    }
}

class Class2 implements Common
{
    public function name(): string
    {
        return 'Class2' . '
';     } }
// 工厂方法类
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)类和实现工厂类的子类代码。增加了工厂类的抽象性和理解难度。

';
    }
}

class ClassB implements Class1
{
    public function name(): string
    {
        return 'ClassB name' . '
';     } } interface Class2 {     // 定义一个接口, 让子类实现     public function type(); } class ClassC implements Class2 {     public function type(): string     {         return 'ClassC type' . '
';     } } class ClassD implements Class2 {     public function type(): string     {         return 'ClassD type' . '
';     } }
// 工厂方法类
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

测试代码下载:

Factory.zip

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/2444.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号