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

专业一点的定义为:

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

php设计模式之抽象工厂模式的更多相关文章

  1. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  2. 桥接模式及C++实现 C++设计模式-AbstractFactory抽象工厂模式

    桥接模式及C++实现 桥接模式 先说说桥接模式的定义:将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式之一 ...

  3. Java 设计模式之抽象工厂模式(三)

    原文地址:Java 设计模式之抽象工厂模式(三) 博客地址:http://www.extlight.com 一.前言 上篇文章 <Java 设计模式之工厂模式(二)>,介绍了简单工厂模式和 ...

  4. java设计模式之抽象工厂模式

    上一篇文章(http://www.cnblogs.com/liaoweipeng/p/5768197.html)讲了简单工厂模式,但是简单工厂模式存在一定的问题,如果想要拓展程序,必须对工厂类进行修改 ...

  5. 再起航,我的学习笔记之JavaScript设计模式06(抽象工厂模式)

    我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...

  6. C#设计模式(4)-抽象工厂模式

    引言 上一篇介绍了设计模式中的简单工厂模式-C#设计模式(3)-工厂方法模式,本篇将介绍抽象工厂模式: 抽象工厂模式简介 抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依 ...

  7. C#设计模式之四抽象工厂模式(AbstractFactory)【创建型】

    一.引言     写了3篇有关设计模式的文章了,大家有了些反馈,说能从中学到一些东西,我感到很欣慰,那就继续努力.今天我要写第四个模式了,该模式叫抽象工厂.上一篇文章我们讲了[工厂方法]模式,它是为了 ...

  8. Head First设计模式之抽象工厂模式

    一.定义 给客户端提供一个接口,可以创建多个产品族中的产品对象 ,而且使用抽象工厂模式还要满足一下条件:     1)系统中有多个产品族,而系统一次只可能消费其中一族产品.      2)同属于同一个 ...

  9. 【Unity与23种设计模式】抽象工厂模式(Abstract Factory)

    GoF中定义: "提供一个能够建立整个类群组或有关联的对象,而不必指明它们的具体类." 意思就是 根据不同的执行环境产生不同的抽象类子类 抽象工厂模式经常在面试中会涉及到 下面的例 ...

随机推荐

  1. 出现Deprecated: Function ereg_replace() is deprecated in 的原因及解决方法

    在 php5.3环境下运行oscommerce,常常会出现Deprecated: Function ereg() is deprecated in...和Deprecated: Function er ...

  2. JS中apply与call的含义与区别

    JavaScript中,apply()与call()的含义一样,均为改变调用函数中的this指向.其中apply()与call()的第一个参数表示所要指向的对象,若调用函数无参数可不写,则默认为win ...

  3. ZOJ 2109 FatMouse&#39; Trade (背包 dp + 贪婪)

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1109 FatMouse prepared M pounds of cat ...

  4. 邮箱自动完成(jquary效果)

    邮箱自动完成的效果在网站上大多都看过,但是质量参差不齐,今天突然在网上看到一篇博客,感觉这个插件很好,就想来写一下分享给大家! 效果图如下! 完整demo代码如下: <!DOCTYPE html ...

  5. Hudson安装配置、部署应用及分析

    一.部署环境 机器:一台linux虚机,内存1G,操作系统CentOS release 5.6,硬盘100G. 实验应用:乐学方舟后台部署(非正式环境) 应用环境:apache-tomcat-7.0. ...

  6. WCF 采用net.tcp协议

    WCF 采用net.tcp协议实践   概述 与Socket相比,WCF真是爽得不得了,其基本指导思想为SOA——面向服务. 其基本配置在于ABC(Address,Binding,Contract), ...

  7. 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历

    根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...

  8. NUnit单元测试资料汇总

    NUnit单元测试资料汇总 从安装到配置 首先到官网http://www.nunit.org/下载如下图的资料,安装NUnit-2.6.1.msi包. 然后挂在VS2010外部工具这个地方来使用,工具 ...

  9. SZU:G32 Mass fraction

    Judge Info Memory Limit: 32768KB Case Time Limit: 5000MS Time Limit: 5000MS Judger: Float Numbers (1 ...

  10. 测试驱动 ASP.NET MVC Type Aliase

    Type Aliase 去掉Scala的糖衣(4) -- Type Aliase 我的新博客地址:http://cuipengfei.me/blog/2013/12/23/desugar-scala- ...