设计模式专题(十一)——抽象工厂模式
设计模式专题(十一)——抽象工厂模式
(原创内容,转载请注明来源,谢谢)
一、概述
抽象工厂模式(AbstractFactory),提供创建一系列相关或者相互依赖的接口,不需要指定他们具体的类。
抽象工厂模式是在工厂方法模式的基础上,将工厂类进行扩充,当有多种不同的工厂,且每个工厂都有很多的子工厂时,就可以使用此模式。在工厂抽象类的基础上,根据不同的工厂建多个抽象类,这样当需要切换工厂时,只需要切换抽象类的声明即可。
二、特点
1、便于交换产品
一个应用中,只需要在初始化的时候出现一次,使得改变一个工厂很容易,相当于把工厂当作配置文件,供客户端使用。
2、解耦与灵活性
抽象工厂模式,让创建实例的过程与客户端分离,客户端通过抽象接口操纵实例,产品的具体类名也被具体的工厂实现分离,不会直接出现在代码中。
3、缺点——涉及的类多
由于大量的用到了抽象,因此需要创建的类很多,每新增一个工厂时,需要增加好几个类,且当有方法需要变动时,改动的地方也较多。
因此,常常结合简单工厂模式和抽象工厂模式,将抽象工厂模式不是在工厂方法模式中去抽象,而是将简单工厂模式进行抽象。
三、类图
四、业务场景
1、业务分析
现有两个业务系统,使用的数据库不一样,用不同的方式进行报表统计,一个是分区域进行统计,一个是分产品类型进行统计。由于不同的系统由不同的人员进行开发,因此确实可能存在不同的数据库。
此时,需要开发一个比对系统,比较两个系统的统计结果的一致性,则需要在两个数据库中进行切换,假设两个数据库是mysql和oracle,且操作的表较多,现假设比对的是order和stock两个表。则抽象工厂模式可以解决此问题。
2、项目分析
现需要设计以下内容:
1)抽象接口OrderInterface,定义实现countByDate、countByArea等方法。
2)两个具体类,MysqlOrder和OracleOrder,分别继承OrderInterface,用Mysql和Oracle的方法去实现。
3)抽象接口StockInterface,定义实现stockAnalysis、stockRemain等方法。
4)两个具体类,MysqlStock和OracleStock,分别基础StockInterface。
5)数据库操作类DataAccessObject(很多地方称为DAO),其接收用户传入的参数,判断如果是mysql就加载mysql相关的类,如果是oracle则加载oracle相关的类。
6)客户端,调用DataAccessObject,传入参数,并获取返回的结果。
3、具体实现
interfaceOrderInterface{
public functioncountByDate($start, $end){}
public functioncountByArea($xRadio, $yRadio){}
}
class MysqlOrder implements OrderInterface{
public functioncountByDate($start, $end){
//...mysql的方式处理
}
public functioncountByArea($xRadio, $yRadio){
//...mysql的方式处理
}
}
class OracleOrder implements OrderInterface{
public functioncountByDate($start, $end){
//...oracle的方式处理
}
public functioncountByArea($xRadio, $yRadio){
//...oracle的方式处理
}
}
//stockinterface以及两个类类似,省略
//dataAccessObject
class DataAccessObject{
private $dbType;
public function__construct($dbType){
$this->dbType= $dbType;
}
public function__set($prop, $val){
$this->$prop= $val;
}
public function__get($prop){
return$this->$prop;
}
public functiongetData(){
$classOrder= ucfirst(strtolower($this->dbType)) . 'Order';//转换成Mysql格式,即首字母大写,其他小写
$objOrder =new $classOrder();
$classStock= ucfirst(strtolower($this->dbType)) . 'Stock';//转换成Mysql格式,即首字母大写,其他小写
$objStock =new $classStock();
return array(
$objOrder->countByDate($start,$end),
$objOrder->countByArea($xRadio,$yRadio),
//$objStock->xxxx,
//$objStock->yyyy
);
}
}
//客户端调用
$dao = new DataAccessObject)('mysql');
$res = $dao->getData();
—written by linhxx 2017.08.03
相关阅读:
设计模式专题(十)——观察者模式
设计模式专题(九) ——外观模式
设计模式专题(八) ——模板方法模式
设计模式专题(七)——建造者模式
设计模式专题(六)——原型模式
设计模式专题(五)——工厂方法模式
设计模式专题(四)——代理模式
设计模式专题(三)——装饰模式
设计模式专题(二)——策略模式
设计模式专题(一)——面向对象的设计原则
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 宝塔Linux面板之好用免费的中文Linux VPS主机控制面板适合快速建站
- Linux中openssl/opensslv.h找不到问题的解决方法
- CentOS7 安装 PostgreSQL11的方法步骤
- Linux中FTP服务器的搭建教程
- ubuntu下编译安装opencv的方法
- CentOS7如何执行PHP定时任务详解
- linux中ssh免密通信的实现
- Linux 启动停止SpringBoot jar 程序部署Shell 脚本的方法
- linux下安装boost库的完整步骤记录
- Linux下使用killall命令终止进程的8大用法实例详解
- 关于AIX挂载NFS写入效率低效的解决方法
- Linux查看进程的所有信息的方法示例
- 新版VPS主机管理面板WDCP安装及使用体验-国产简单易用型VPS面板
- linux中普通用户的定时任务详解
- 详解在Linux中清空或删除大文件内容的5种方法