设计模式:工厂模式


   工厂模式其实是一种类,它具有创建对象的某些方法。我们可以使用工厂类来创建对象,而不是直接使用new。这样做的好处是,如果你想要更改实例化的类名,则只需要更改该工厂方法内容即可,不需要追一寻找代码中具体实例化的地方来修改。为系统结构提供灵活的动态扩展机制,减少耦合。

 

工厂模式可根据抽象程度不同可以分为:简单工厂模式、工厂方法模式和抽象工厂模式。

1、简单工厂模式

主要用来生产同一等级结构中的任意产品。不支持增加新的产品。它适用于创建对象较少的时候

2、工厂方法模式

主要用来生产同一等级结构中的固定产品,并且支持增加任意产品,它适用于生成数量多且功能复杂的产品。

3、抽象工厂模式

主要用来生成不同产品族的全部产品,同样不支持增加新产品但支持增加产品族。它适用于生成多个产品族而且易于扩展添加新的产品族。

 

一、简单工厂模式

提供一个创建对象实例的功能,而无需关心其具体的实现,被创建实例的类型可以是接口、抽象类,也可以是具体的类。

以下是一个实例:

interface UiInterface
{
    public function getName();
}

class Bootstrap implements UiInterface
{
    public function getName()
    {
        return 'bootstrap';
    }
}
class Element implements UiInterface
{
    public function getName()
    {
        return 'element';
    }
}
class UiFactory
{
    public static function createInstance($type)
    {
        $instance = null;

        switch ($type) {
            case 1:
                $instance = new Bootstrap();

                break;

            case 2:
                $instance = new Element();

                break;
        }

        return $instance;
    }
}
dump(UiFactory::createInstance(1)->getName());
dump(UiFactory::createInstance(2)->getName());
// 输出
string(9) "bootstrap"
string(7) "element"

二、工厂方法模式

工厂方法模式是在简单工厂模式的基础上进行了改进,它将创建对象的工作交给了各个子类,每个对象类型都有对应的工厂类。

这种模式的优点在于各个对象类型的创建于工厂类的创建分离,遵循了 单一职责原则,而且扩展性也很好。但是它也有缺点,在需要创建多个对象类型是,需要编写大量的工厂类。

interface UiInterface
{
    public function getName();
}

class Bootstrap implements UiInterface
{
    public function getName()
    {
        return 'bootstrap';
    }
}
class Element implements UiInterface
{
    public function getName()
    {
        return 'element';
    }
}

abstract class AbstractUiFactory
{
    abstract public function createInstance();
}

class BootstrapFactory extends AbstractUiFactory
{
    public function createInstance()
    {
        return new Bootstrap();
    }
}

class ElementFactory extends AbstractUiFactory
{
    public function createInstance()
    {
        return new Element();
    }
}
$bootstrapFactory = new BootstrapFactory();
dump($bootstrapFactory->createInstance()->getName());

$elementFactory = new ElementFactory();
dump($elementFactory->createInstance()->getName());


// 输出
string(9) "bootstrap"
string(7) "element"

三、抽象工厂模式

抽象工厂模式是在工厂方法模式的基础上进行改进,它对工厂和对象之间的关系进行了进一步的抽象和封装,可以创建更复杂的对象结构。抽象工厂模式的优点在于可以隔离具体类的生成,让用户关心对象的接口,而不需要关心对象的创建过程。但是他的缺点在于可扩展性不好,添加新的功能需要修改接口和所有实现类。

interface UiInterface
{
    public function getName();
}

interface TechnicalInterface
{
    public function getName();
}

class Bootstrap implements UiInterface
{
    public function getName()
    {
        return 'bootstrap';
    }
}
class Element implements UiInterface
{
    public function getName()
    {
        return 'element';
    }
}

class Vue implements TechnicalInterface
{
    public function getName()
    {
        return 'vue';
    }
}

class Reactive implements TechnicalInterface
{
    public function getName()
    {
        return 'reactive';
    }
}
abstract class AbstractUiFactory
{
    abstract public function createUi();

    abstract public function createTechnical();
}

class VBFactory extends AbstractUiFactory
{
    public function createUi()
    {
        return new Bootstrap();
    }

    public function createTechnical()
    {
        return new Vue();
    }
}

class VEFactory extends AbstractUiFactory
{
    public function createUi()
    {
        return new Element();
    }

    public function createTechnical()
    {
        return new Vue();
    }
}
class RBFactory extends AbstractUiFactory
{
    public function createUi()
    {
        return new Bootstrap();
    }

    public function createTechnical()
    {
        return new Reactive();
    }
}

class REFactory extends AbstractUiFactory
{
    public function createUi()
    {
        return new Element();
    }

    public function createTechnical()
    {
        return new Reactive();
    }
}

 

 

实例

功能:文件上传

需求:兼容市面上的云存储平台。能够快速切换平台进行文件上传。

interface FileManageInterface
{
    // 上传文件
    public function upload();

    // 云存储上传所需token
    public function token();

    // 上传目录
    public function uploadDir();
}

class Aliyun implements FileManageInterface
{
    public function upload()
    {
        // TODO: Implement upload() method.
    }

    public function token()
    {
        // TODO: Implement token() method.
    }

    public function uploadDir()
    {
        // TODO: Implement uploadDir() method.
    }
}

class Qiniu implements FileManageInterface
{
    public function upload()
    {
        // TODO: Implement upload() method.
    }

    public function token()
    {
        // TODO: Implement token() method.
    }

    public function uploadDir()
    {
        // TODO: Implement uploadDir() method.
    }
}

class FileManageFactory
{
    public static function createInstance($type)
    {
        $instance = null;

        switch ($type) {
            case 1:
                $instance = new Aliyun();

                break;

            case 2:
                $instance = new Qiniu();

                break;
        }

        return $instance;
    }
}

FileManageFactory::createInstance(1)->upload();
发布时间 : 2023-02-28,阅读量:1016
本文链接:https://upwqy.com/details/390.html
request to https://registry.npm.taobao.org/create-vue failed, reason: certificate has expired PHP 页面跳转的三种方式