引言
 
  所属:创建型模式,常用设计模式之一
  
  参考资料:
    • 《大话设计模式》程杰
 
模式概述
  
  官方定义:抽象工厂模式(Abstract Factory),提供一个创建一系列相关或互相依赖对象的接口,而无需指定它们具体的类。
  
  大意:创建一个约束接口,相关功能去按照接口规范实现这个接口达到统一;
  
举个栗子
 
    模拟场景:两个甲方,分别为甲方A,甲方B,甲方A使用MySQL数据库,甲方B使用Oracle,由于两种数据库的SQL查询语句语法有部分不一致,这时要同时编写【用户类】,【订单类】,如果用抽象工厂实现?
 
    流程图如下:
      
          

    
程序设计代码:
 
1. 产品类接口
<?php
/**
* 用户产品类具体操作接口
*/
namespace abstract_factory; interface UserInterface
{
/**
* 查询操作接口
* @return mixed
*/
public function select(); /**
* 插入操作接口
* @return mixed
*/
public function insert();
}
<?php
/**
* 订单产品类具体操作接口
*/
namespace abstract_factory; interface OrderInterface
{
/**
* 查询操作接口
* @return mixed
*/
public function select(); /**
* 插入操作接口
* @return mixed
*/
public function insert();
}
2. 具体产品操作类
<?php
/**
* MySQL 订单产品类具体操作
*/
namespace abstract_factory; class MysqlOrder
{
/**
* 查询具体操作
*/
public function select()
{
echo '订单表查询';
} /**
* 插入具体操作
*/
public function insert()
{
echo '订单表插入';
}
}
<?php
/**
* MySQL 用户产品类具体操作
*/
namespace abstract_factory; class MysqlUser
{
/**
* 查询操作
*/
public function select()
{
echo '订单表查询';
} /**
* 插入操作
*/
public function insert()
{
echo '订单表插入';
}
}
<?php
/**
* Oracle 订单产品类具体操作
*/
namespace abstract_factory; class OracleOrder
{
/**
* 查询具体操作
*/
public function select()
{
echo '订单表查询';
} /**
* 插入具体操作
*/
public function insert()
{
echo '订单表插入';
}
}
<?php
/**e
* Oracle 用户产品类具体操作
*/
namespace abstract_factory; class OracleUser
{
/**
* 查询操作
*/
public function select()
{
echo '用户表查询';
} /**
* 插入操作
*/
public function insert()
{
echo '用户表插入';
}
}
3. 定义需要实例产品类的工厂类接口数量
<?php
/**
* 定义需要实例产品类的工厂类接口数量
*/
namespace abstract_factory; interface DBFactoryInterface
{
/**
* 用户工厂类接口
* @return mixed
*/
public function createUser(); /**
* 订单工厂类接口
* @return mixed
*/
public function createOrder();
}
4. 包装产品类升级为工厂类 
<?php
/**
* MySQL操作 包装产品类升级为工厂类
*/
namespace abstract_factory; class MysqlFactory implements DBFactoryInterface
{
/**
* 用户产品类
* @return MysqlUser
*/
public function createUser()
{
return new MysqlUser();
} /**
* 用户产品类
* @return MysqlOrder
*/
public function createOrder()
{
return new MysqlOrder();
} }
<?php
/**
* Oracle操作 包装产品类升级为工厂类
*/
namespace abstract_factory; class OracleFactory implements DBFactoryInterface
{
/**
* 用户产品类
* @return OracleUser
*/
public function createUser()
{
return new OracleUser();
} /**
* 订单产品类
* @return OracleOrder
*/
public function createOrder()
{
return new OracleOrder();
} }
以下为源码地址

  GitHub源码地址:https://github.com/xiaobaoword/design_pattern/tree/master

「PHP」抽象工厂模式的更多相关文章

  1. 「PHP」简单工厂模式

    引言   所属:创建型模式,常用设计模式之一 工厂模式分为:简单工厂模式.工厂方法模式.静态工厂模式.抽象工厂模式. 下面为简单工厂模式.   参考资料: <大话设计模式>程杰   模式概 ...

  2. PHP设计模式(三)抽象工厂模式(Abstract Factory For PHP)

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

  3. 面向对象设计模式纵横谈:Abstract Factory 抽象工厂模式(笔记记录)

         今天是设计模式的第二讲,抽象工厂的设计模式,我们还是延续老办法,一步一步的.演变的来讲,先来看看一个对象创建的问题. 1.如何创建一个对象 常规的对象创建方法: 这样的创建对象没有任何问题, ...

  4. Objective-C 工厂模式(下) -- 抽象工厂模式

    相比简单工厂模式, 只有一个工厂 能生产的手机也是固定的 抽象工厂模式类似于有很多家工厂, 当用户要买什么手机就创建对应的工厂去生产 比如用户要买iPhone就创建一个Apple工厂来生产手机, 要买 ...

  5. Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  6. .NET设计模式(2):1.2 抽象工厂模式(Abstract Factory)

    概述 抽象工厂模式(Abstract Factory)是所有形态的工厂模式中最为抽象和最具一般性的一种形态.抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口 ...

  7. 设计模式(四)抽象工厂模式(Abstract Factory Pattern)

    一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建 ...

  8. php实现设计模式之 抽象工厂模式

    <?php /*抽象工厂模式:提供一个创建一系统相关或相互依赖对象的接口,而无需指定它们具体的类 * 创建型模式 */ //抽象小米工厂,能制造小米一,小米二 abstract class mi ...

  9. 设计模式(3)--抽象工厂模式(Absrtact Factory Pattern)

    定义 抽象工厂模式的实质就是提供接口来创建一系列相关或独立的对象而不指定这些对象的具体类. 理解 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往 ...

随机推荐

  1. Linux下mysql安装过程

    到mysql官网下载mysql编译好的二进制安装包,在下载页面Select Platform:选项选择linux-generic,然后把页面拉到底部,64位系统下载Linux - Generic (g ...

  2. Canvas杂谈

    最近在看一些关于Canvas的知识...这篇文章主要是用来记录学习中遇见的一些问题...以及难以理解的一些东西.. 转帖请注明出处:http://www.cnblogs.com/Troy-Lv5/p/ ...

  3. java代码修改了之后运行仍然是原程序

    有的时候java代码改了之后但是运行的程序却没有发生改动,这是什么情况呢?可能懂得的人都觉得十分简单,但对于我这样的小白来说确实很费力.java代码更改后需要编译生成.class文件,说的直白点,这个 ...

  4. .net 面向对象程序设计深入](3)UML

    1.活动图简介 定义:是阐明了业务用例实现的工作流程. 业务工作流程说明了业务为向所服务的业务主角提供其所需的价值而必须完成的工作. 业务用例由一系列活动组成,它们共同为业务主角生成某些工件. 工作流 ...

  5. python接口自动化4-绕过验证码登录(cookie) (转载)

    前言 有些登录的接口会有验证码:短信验证码,图形验证码等,这种登录的话验证码参数可以从后台获取的(或者查数据库最直接). 获取不到也没关系,可以通过添加cookie的方式绕过验证码. 一.抓登录coo ...

  6. Linux账号管理和ACL

    by zjmyster version :1.2 Linux账号管理和ACL权限设置: 主要相关配置文件:/etc/passwd /etc/shadow /etc/group /etc/gshadow ...

  7. Spring学习总结之---装配Bean

    Spring配置的可选方案 前言:Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,作为开发人员,你需要告诉Spring容器要创建那些Bean,以哪种方式创建,并且如何将 ...

  8. Exchange 2016 体系结构简介

    一.Exchange 2016简介 现在,CPU计算能力的成本显著降低,不再成为约束因素.随着此约束因素的消失,Exchange2016的主要设计目标是简化扩展.提高硬件利用率和实现故障隔离:在Exc ...

  9. python数据结构(整理)

    http://www.cnblogs.com/yupeng/p/3413763.html 1. 单链表 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点 ...

  10. JavaScript的DOM_操作表格

    一.使用HTML标签创建表格 thead.tfoot.caption标签在一个表格中只能有一个    tbody.tr.td.th标签在一个表格中可以有N个 <table border=&quo ...