求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
计模式之六 --- 抽象工厂模式(Abstract Factory)
 

作者:cjjky,发布于2012-3-19

 

每个模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。

在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。

产品族:是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的CPU和ADM芯片的主板,组成一个家族。Intel的CPU和Intel芯片的主板,又组成一个家族。而这两个家族都来自于两个产品等级:CPU,主板。一个等级结构是由相同的结构的产品组成,示意图如下:

理解这个产品结构是理解抽象工厂模式的关键所在,从上图可以看出,抽象工厂模式的每个工厂创造出来的都是一族产品,而不是一个或者一组。组是可以随意组合的!其实工厂方法模式和抽象工厂模式就这点点差别。

基本概念

抽象工厂模式是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体类。

简单分析

我们先看一下抽象工厂模式的UML结构图:

上图是 Abstract Factory 模式结构图,让我们可以进行更加方便的描述:

1. AbstractProduct: 抽象产品,它们都有可能有两种不同的实现。

2. ConcreteProduct:包括ProductA和ProductB, 对两个抽象产品的具体分类的实现。

3. AbstractFactory: 抽象工厂接口,它里面应该包含所有的产品创建的抽象方法。

4. ConcreteFactory: 包括ConcreteFactoryA和ConcreteFactoryB,具体的工厂,创建具有特定实现的产品对象。

如何用java语言来实现该模式

背景:用一个分别对不同数据库(Oracle 或 SQL Server)中表( User 和 Department )的操作的实例来展示该设计模式。先看下代码的结构图:

3.1 首先定义两个抽象的产品类:IUser.java 和 IDepartment.java。

IUser.java的源码:

package com.andyidea.patterns.abstractproduct;

/**

* 抽象产品角色:User接口

* @author Andy.Chen

*

*/

public interface IUser {

}

IDepartment.java源码:

package com.andyidea.patterns.abstractproduct;

/**

* 抽象产品角色:Department接口

* @author Andy.Chen

*

*/

public interface IDepartment {

}

3.2 定义抽象工厂类:IDBFactory.java

package com.andyidea.patterns.abstractfactory;

import com.andyidea.patterns.abstractproduct.IDepartment;

import com.andyidea.patterns.abstractproduct.IUser;

/**

* 抽象工厂角色:工厂接口

* @author Andy.Chen

*

*/

public interface IDBFactory {

public IUser createUser();

public IDepartment createDepartment();

}

3.3创建具体产品角色类:OracleOfUser.java;OracleOfDepartment.java;SQLServerOfUser.java

SQLServerOfDepartment.java。分别继承IUser.java和IDepartment.java。

OracleOfUser.java源码

package com.andyidea.patterns.concreteproduct;

import com.andyidea.patterns.abstractproduct.IUser;

/**

* 具体产品角色:Oracle中的User

* @author Andy.Chen

*

*/

public class OracleOfUser implements IUser{

public OracleOfUser(){

System.out.println("Oracle工厂:在Oracle中操作User表.");

}

}

OracleOfDepartment.java源码:

package com.andyidea.patterns.concreteproduct;

import com.andyidea.patterns.abstractproduct.IDepartment;

/**

* 具体产品角色:Oracle中的Department

* @author Andy.Chen

*

*/

public class OracleOfDepartment implements IDepartment{

public OracleOfDepartment(){

System.out.println("Oracle工厂:在Oracle中操作Department表.");

}

}

SQLServerOfUser.java源码:

package com.andyidea.patterns.concreteproduct;

import com.andyidea.patterns.abstractproduct.IUser;

/**

* 具体产品角色:SQL Server中的User

* @author Andy.Chen

*

*/

public class SQLServerOfUser implements IUser{

public SQLServerOfUser(){

System.out.println("SQL Server工厂:在SQL Server中操作User表.");

}

}

SQLServerOfDepartment.java源码:

package com.andyidea.patterns.concreteproduct;

import com.andyidea.patterns.abstractproduct.IDepartment;

/**

* 具体产品角色:SQL Server中的Department

* @author Andy.Chen

*

*/

public class SQLServerOfDepartment implements IDepartment{

public SQLServerOfDepartment(){

System.out.println("SQL Server工厂:在SQL Server中操作Department表.");

}

}

3.4 创建具体工厂类:OracleFactory.java和SQLServerFactory.java。

OracleFactory.java源码:

package com.andyidea.patterns.concretefactory;

import com.andyidea.patterns.abstractfactory.IDBFactory;

import com.andyidea.patterns.abstractproduct.IDepartment;

import com.andyidea.patterns.abstractproduct.IUser;

import com.andyidea.patterns.concreteproduct.OracleOfDepartment;

import com.andyidea.patterns.concreteproduct.OracleOfUser;

/**

* 具体工厂角色:Oracle工厂

* @author Andy.Chen

*

*/

public class OracleFactory implements IDBFactory{

@Override

public IUser createUser() {

return new OracleOfUser();

}

@Override

public IDepartment createDepartment() {

return new OracleOfDepartment();

}

}

SQLServerFactory.java源码:

package com.andyidea.patterns.concretefactory;

import com.andyidea.patterns.abstractfactory.IDBFactory;

import com.andyidea.patterns.abstractproduct.IDepartment;

import com.andyidea.patterns.abstractproduct.IUser;

import com.andyidea.patterns.concreteproduct.SQLServerOfDepartment;

import com.andyidea.patterns.concreteproduct.SQLServerOfUser;

/**

* 具体工厂角色:SQL Server工厂

* @author Andy.Chen

*

*/

public class SQLServerFactory implements IDBFactory{

@Override

public IUser createUser() {

return new SQLServerOfUser();

}

@Override

public IDepartment createDepartment() {

return new SQLServerOfDepartment();

}

}

3.5 客户端测试类:AbstractFactoryClient.java

package com.andyidea.patterns.client;

import com.andyidea.patterns.abstractproduct.IDepartment;

import com.andyidea.patterns.abstractproduct.IUser;

import com.andyidea.patterns.concretefactory.OracleFactory;

import com.andyidea.patterns.concretefactory.SQLServerFactory;

/**

* 抽象工厂测试类

* @author Andy.Chen

*

*/

public class AbstractFactoryClient {

public static void main(String[] args) {

System.out.println("Welcome to Andy.Chen Blog!" +"\n"

        +"Abstract Factory Patterns." +"\n"

        +"-------------------------------");

IUser oracleUser,sqlUser;

IDepartment oracleDept,sqlDept;

OracleFactory of = new OracleFactory();

SQLServerFactory sf = new SQLServerFactory();

oracleUser = of.createUser();

oracleDept = of.createDepartment();

sqlUser = sf.createUser();

sqlDept = sf.createDepartment();

}

}

程序运行结果:

Welcome to Andy.Chen Blog!

Abstract Factory Patterns.

-------------------------------

Oracle工厂:在Oracle中操作User表.

Oracle工厂:在Oracle中操作Department表.

SQL Server工厂:在SQL Server中操作User表.

SQL Server工厂:在SQL Server中操作Department表.

总结

抽象工厂模式优点:

第一,易于交换产品系列,由于具体工厂类,例如IDBFactory factory = new OracleFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它之需要改变具体工厂即可使用不同的产品配置。

第二,它让具体的创建实例与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。


相关文章

企业架构、TOGAF与ArchiMate概览
架构师之路-如何做好业务建模?
大型网站电商网站架构案例和技术架构的示例
完整的Archimate视点指南(包括示例)
相关文档

数据中台技术架构方法论与实践
适用ArchiMate、EA 和 iSpace进行企业架构建模
Zachman企业架构框架简介
企业架构让SOA落地
相关课程

云平台与微服务架构设计
中台战略、中台建设与数字商业
亿级用户高并发、高可用系统架构
高可用分布式架构设计与实践
 
分享到
 
 
     


重构-使代码更简洁优美
Visitor Parttern
由表及里看模式
设计模式随笔系列
深入浅出设计模式-介绍
.NET中的设计模式
更多...   

相关培训课程

J2EE设计模式和性能调优
应用模式设计Java企业级应用
设计模式原理与应用
J2EE设计模式指南
单元测试+重构+设计模式
设计模式及其CSharp实现


某电力公司 设计模式原理
蓝拓扑 设计模式原理及应用
卫星导航 UML & OOAD
汤森路透研发中心 UML& OOAD
中达电通 设计模式原理
西门子 嵌入式设计模式
更多...