• php设计模式----工厂模式


    工厂模式主要是为了代码执行的时候更灵活地new对象,就像工厂流水线一样,批量生产出产品。

    目的:简化对象生成过程,更加灵活。

    例子如下:

    <?php
    /**
     * User: freephp
     * Date: 2015/9/23
     * Time: 16:58
     */
    
    interface Medias {
        function show();  // 展现效果的功能
        function notify(); //有更新通知功能
    }
    
    
    class Picture implements Medias{
        public function show() {
            echo "我是图片服务,高清无码!
    ";
        }
        public function notify() {
            echo "新的一波美图来了,请查看!
    ";
        }
    }
    
    class Video implements Medias{
        public function show() {
            echo "我是视频服务,高清流畅,不卡顿!
    ";
        }
        public function notify() {
            echo "新的一波视频来了,请查看!
    ";
        }
    }
    
    class Sound implements Medias{
        public function show() {
            echo "我是音频服务,无损音质!
    ";
        }
        public function notify() {
            echo "新的一波音频来了,请查看!
    ";
        }
    }
    
    /**
    * 工厂类,负责对象生产
    */
    class Factory {
        private static function getValidSource() {
            return array(
                "Picture",
                "Video",
                "Sound"
            );
        }
        public static function create($sourceName) {
            if(in_array($sourceName, self::getValidSource())) {
                return new $sourceName();
    
            } else {
                echo "暂不支持这种服务!
    ";die();
            }
        }
    }
    
    // -------------客户端--------
    $soundSer = Factory::create('Sound');
    $soundSer->notify();
    
    $soundSer->show();
    
    $Ser = Factory::create('Picture');
    $Ser->notify();
    $Ser->show();

    输出结果如下:

    新的一波音频来了,请查看!
    我是音频服务,无损音质!
    新的一波美图来了,请查看!
    我是图片服务,高清无码!

    代码中定义了一个接口Medias,清晰指出了要实现的通用功能。而Factory类中配置了合法的对象类数组,防止了非法服务对象的创建。(特殊服务要不得!)利用php的灵活特性,动态生成不同服务对象,又基于接口编程,实现了同一接口,不同服务的体现。

    一般来说,如果Picture类和其他服务类在不同的文件中,则需要在Factory的create中require进来,文件名命名按照一定规律,然后截取获得对应文件,再new出对应对象。
  • 相关阅读:
    不可变类
    单例类
    二叉树的三种遍历
    先序创建二叉树
    【笔记】 mysql与php的连接以及非select的例子
    今日思考之 20200730:非阻塞(NIO)到底带来了什么改变?
    jdk源码学习之: Object#equals() 和 Object#hashCode()
    异想天开 之 快递行业与高并发、高吞吐
    分享系列 之 BIO NIO AIO
    挖坑:epoll 函数如何能准确知道哪些 FD 是活跃的呢?
  • 原文地址:https://www.cnblogs.com/freephp/p/4832882.html
Copyright © 2020-2023  润新知