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 "\r\n"; $ubuntuPhone->play(); echo "\r\n"; $surface = WinFactory::createTab(); $surface->show(); echo "\r\n"; $surface->play();
输出结果为:
$ php testAbstractFactory.php
ubuntu手机显示炫酷桌面
播放高清视频,偶也!
surface show all apps
play the video!!
无论是抽象工厂还是简单工厂,都是基于接口编程,更加灵活地去处理new 对象的问题,并且对客户端暴露统一的接口,隐藏内部细节.