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 对象的问题,并且对客户端暴露统一的接口,隐藏内部细节.

原文地址:https://www.cnblogs.com/freephp/p/4834927.html