设计模式专题(十一)——抽象工厂模式

设计模式专题(十一)——抽象工厂模式

(原创内容,转载请注明来源,谢谢)

一、概述

抽象工厂模式(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

相关阅读:

设计模式专题(十)——观察者模式

设计模式专题(九) ——外观模式

设计模式专题(八) ——模板方法模式

设计模式专题(七)——建造者模式

设计模式专题(六)——原型模式

设计模式专题(五)——工厂方法模式

设计模式专题(四)——代理模式

设计模式专题(三)——装饰模式

设计模式专题(二)——策略模式

设计模式专题(一)——面向对象的设计原则

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏岑玉海

Hive Tuning(一) 连接策略

群里共享了一本hive调优的书记,名叫《Hive Tunning》,就忍不住开始看了,也顺便记录一下自己学到的东西,备忘! 首先,这是hive的数据摘要,别...

3606
来自专栏wOw的Android小站

[设计模式]之十三:抽象工厂模式

抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。

502
来自专栏Java技术栈

如何“优雅”地终止一个线程?

我们的系统肯定有些线程为了保证业务需要是要常驻后台的,一般它们不会自己终止,需要我们通过手动来终止它们。我们知道启动一个线程是start方法,自然有一个对应的终...

3438
来自专栏java一日一条

同步和异步的区别

答案一: 1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步...

424
来自专栏编码前线

关于三种工厂模式的总结

工厂模式分为简单工厂模式,工厂方法模式和抽象工厂模式,它们都属于设计模式中的创建型模式。其主要功能都是帮助我们把对象的实例化部分抽取了出来,目的是降低系统中代...

721
来自专栏fixzd

java多线程系列:CountDownLatch

这篇文章将介绍CountDownLatch这个同步工具类的基本信息以及通过案例来介绍如何使用这个工具。

653
来自专栏陈树义

策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的...

733
来自专栏性能与架构

Spring 5 响应式开发

1964
来自专栏瓜大三哥

UVM(九)之sequence机制续2

UVM(九)之sequence机制续2 1. 用事件做sequence之间的同步 到目前为止,sequence机制就是一个sequence启动之后对应一个seq...

2058
来自专栏Java学习之路

09 Spring框架 AOP (二) 高级用法

上一篇文章我们主要讲了一点关于AOP编程,它的动态考虑程序的运行过程,和Spring中AOP的应用,前置通知,后置通知,环绕通知和异常通知,这些都是Spring...

3525

扫码关注云+社区