• php设计模式之抽象工厂模式


    之前总结了一下工厂模式,其实准确地说是简单 工厂模式,在它的基础上再进行抽象就可以得到一种新的模式:抽象工厂模式。

    专业一点的定义为:

    抽象工厂模式(Abstact Factory)是一种常见的软件设计模式。该模式为一个产品族提供了统一的创建接口。当需要这个产品族的某一系列的时候,可以为此系列的产品族创建一个具体的工厂类。

    In a word:

    抽象工厂可以看做是多个简单工厂的集合。我们往往把一种简单工厂看做只生产一类产品族群的工厂。

    什么时候用抽象工厂模式?当我们需要的产品(也就是对象)不止一种族群的时候,就可以使用该模式。下面给出uml图,便于理解结构关系:

    在原本的工厂类之上再抽象出一个基类(抽象类),定义公共 接口以待实现。不同的产品族中的产品也抽象出一个基类,对产品功能特性进行规范。 

    比如Linux 和windows系列产品族,各自有自己的产品。

    Linux: 手机(安卓,还有ubuntu手机),电脑系统(redHat,ubuntu,centos等发行版),平板(安卓)。

    windows:手机(lumia,wp手机),电脑系统(windows xp,7,8,8.1,10 or other),平板(surface)。

     (待续....)

    <?php
    /**
     * Created by PhpStorm.
     * User: freephp<fightforphp@gmail.com>
     * Date: 9/27/15
     * Time: 9:18 PM
     */
    
    /**
     * Interface IFactory 抽象工厂接口
     */
    interface IFactory {
        /**
         * @return mixed
         */
        public static function createMobile(); // 生成手机族
    
        /**
         * @return mixed
         */
        public static function createTab(); // 生成平板族
    }
    
    /**
     * Interface IProduct 抽象产品族
     */
    interface IProduct {
        /**
         * @return mixed
         */
        public function show(); // 展现图像
    
        /**
         * @return mixed
         */
        public function play(); // 播放视频音频
    }
    
    /**
     * Class UbuntuMobile ubuntu手机类(魅族貌似已经出了)
     */
    class UbuntuMobile implements IProduct {
    
        /**
         * 展现桌面
         */
        public function show() {
            echo 'ubuntu手机显示炫酷桌面';
        }
    
        /**
         *  播放
         *
         */
        public function play() {
            echo '播放高清视频,偶也!';
        }
    }
    
    /**
     * Class WindowsMobile wp手机类
     */
    class WindowsMobile implements IProduct {
    
        /**
         * 展示
         */
        public function show() {
            echo 'windows手机显示metro风格图标';
        }
    
        /**
         * 播放
         */
        public function play() {
            echo '播放小电影,哈啊哈';
        }
    }
    
    /**
     * Class UbuntuTab ubuntu平板(其实是我YY出来的)
     */
    class UbuntuTab implements IProduct {
    
        /**
         * 展现桌面
         */
        public function show() {
            echo 'ubuntu手机显示炫酷桌面';
        }
    
        /**
         * play video
         */
        public function play() {
            echo '播放高清视频,偶也!';
        }
    }
    
    /**
     * Class Surface win平板类
     */
    class Surface implements IProduct {
    
        /**
         * 展示所有apps
         */
        public function show() {
            echo 'surface show all apps';
        }
    
        /**
         * 播放
         */
        public function play() {
            echo 'play the video!!';
        }
    }
    
    /**
     * Class LinuxFactory linux工厂类
     */
    class LinuxFactory implements IFactory {
        /**
         * @return UbuntuMobile 创建ubuntu手机
         */
        public static function  createMobile() {
            return new UbuntuMobile();
        }
    
        /**
         * @return UbuntuTab 创建ubuntu平板
         */
        public static function createTab() {
            return new UbuntuTab();
        }
    }
    
    /**
     * Class WinFactory windows产品工厂类
     */
    class WinFactory implements IFactory {
        /**
         * @return WindowsMobile 创建wp手机
         */
        public static function  createMobile() {
            return new WindowsMobile();
        }
    
        /**
         * @return Surface 创建surface
         */
        public static function createTab() {
            return new Surface();
        }
    }
    
    // ------------客户端调用 -----------
    $ubuntuPhone = LinuxFactory::createMobile();
    $ubuntuPhone->show();
    echo "
    ";
    $ubuntuPhone->play();
    echo "
    ";
    
    $surface = WinFactory::createTab();
    $surface->show();
    echo "
    ";
    $surface->play();



    输出结果为:

    $ php testAbstractFactory.php
    ubuntu手机显示炫酷桌面
    播放高清视频,偶也!
    surface show all apps
    play the video!!

    无论是抽象工厂还是简单工厂,都是基于接口编程,更加灵活地去处理new 对象的问题,并且对客户端暴露统一的接口,隐藏内部细节.

  • 相关阅读:
    2016总结
    centos7安装后的防火墙问题
    推荐一个静态页面生成工具-mkdocs
    shell中单引号、双引号、反引号的区别
    git 出现502错误后用depth一步一步来
    ./test.sh . ./test.sh source ./test.sh的区别
    终端内容输出的同时保存到文件 tee
    nginx出现的403错误
    ubuntu下wine操作usb串口
    tmux的使用
  • 原文地址:https://www.cnblogs.com/freephp/p/4834927.html
Copyright © 2020-2023  润新知