2020-06-30 工厂模式

工厂模式


特点

在不修改源代码的情况下可以添加新的模块、符合开闭原则,但是新模块添加的时候需要添加具体的模块类以及对应的工厂类

只能生产相同种类的实例,比如肉类工厂、蔬菜工厂、冰箱工厂......针对某种类型的专业工厂并非综合工厂(抽象工厂)什么都可以加工

角色

  1. 抽象工厂

  2. 具体工厂

  3. 抽象产品

  4. 具体产品

UML图

image.png

应用场景

模块与模块之间衔接的地方可以考虑使用

个人思考:使用Ioc是不是会更好

但工厂方法会制造更多同类型(实现同一接口)的实例,Ioc 是同一个类型实例

代码演示

<?php


interface Platform
{
    public function show();
}

interface PlatformFactory
{
    public function get(): Platform;
}

class PlatformAFactory implements PlatformFactory
{
    public function get(): Platform
    {
        return new PlatformA();
    }
}

class PlatformA implements Platform
{
    public function __construct()
    {
        echo "制造PlatformA" . PHP_EOL;
    }

    public function show()
    {
        echo "PlatformA show" . PHP_EOL;
    }
}


class PlatformBFactory implements PlatformFactory
{
    public function get(): Platform
    {
        return new PlatformB();
    }

}

class PlatformB implements Platform
{
    public function __construct()
    {
        echo "制造PlatformA" . PHP_EOL;
    }

    public function show()
    {
        echo "PlatformB show" . PHP_EOL;
    }
}


class App
{
    public static function run(PlatformFactory $pf)
    {
        # 这里 不管你传递的是哪个工厂,只要实现了PlatformFactory
        # 就可以调用show方法 不必关心哪个工厂
        $pf->get()->show();
    }
}

App::run(new PlatformAFactory());
App::run(new PlatformBFactory());

简单IOC

写下来方便对比

<?php

class Ioc
{
    private static $parsed;

    private static $bind;

    public static function get(string $name)
    {
        if(empty(self::$parsed[$name])) {
            self::$parsed[$name] = call_user_func(self::$bind[$name]);
        }
        return self::$parsed[$name];
    }

    public static function set(string $name, Closure $closure)
    {
        self::$bind [$name] = $closure;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容