美文网首页
2020-06-30 工厂模式

2020-06-30 工厂模式

作者: 布衣码农 | 来源:发表于2020-06-30 15:01 被阅读0次

    工厂模式


    特点

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

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

    角色

    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;
        }
    }
    

    相关文章

      网友评论

          本文标题:2020-06-30 工厂模式

          本文链接:https://www.haomeiwen.com/subject/asdxqktx.html