http://blog.csdn.net/cjjky/article/details/7346893

每个模式都是针对一定问题的解决方案。抽象工厂模式面对的问题是多产品等级结构的系统设计。
         在学习抽象工厂具体实例之前,应该明白两个重要的概念:产品族和产品等级。

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

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

【1】基本概念

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

【2】简单分析

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

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

  1. AbstractProduct: 抽象产品,它们都有可能有两种不同的实现。
  2. ConcreteProduct:包括ProductA和ProductB, 对两个抽象产品的具体分类的实现。
  3. AbstractFactory: 抽象工厂接口,它里面应该包含所有的产品创建的抽象方法。
  4. ConcreteFactory: 包括ConcreteFactoryA和ConcreteFactoryB,具体的工厂,创建具有特定实现的产品对象。

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

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

IUser.java的源码:

[html] view plain copy print ?
  1. package com.andyidea.patterns.abstractproduct;
  2. /**
  3. * 抽象产品角色:User接口
  4. * @author Andy.Chen
  5. *
  6. */
  7. public interface IUser {
  8. }
package com.andyidea.patterns.abstractproduct;/*** 抽象产品角色:User接口* @author Andy.Chen**/
public interface IUser {}

IDepartment.java源码:

[html] view plain copy print ?
  1. package com.andyidea.patterns.abstractproduct;
  2. /**
  3. * 抽象产品角色:Department接口
  4. * @author Andy.Chen
  5. *
  6. */
  7. public interface IDepartment {
  8. }
package com.andyidea.patterns.abstractproduct;/*** 抽象产品角色:Department接口* @author Andy.Chen**/
public interface IDepartment {}

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

[html] view plain copy print ?
  1. package com.andyidea.patterns.abstractfactory;
  2. import com.andyidea.patterns.abstractproduct.IDepartment;
  3. import com.andyidea.patterns.abstractproduct.IUser;
  4. /**
  5. * 抽象工厂角色:工厂接口
  6. * @author Andy.Chen
  7. *
  8. */
  9. public interface IDBFactory {
  10. public IUser createUser();
  11. public IDepartment createDepartment();
  12. }
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源码:

[html] view plain copy print ?
  1. package com.andyidea.patterns.concreteproduct;
  2. import com.andyidea.patterns.abstractproduct.IUser;
  3. /**
  4. * 具体产品角色:Oracle中的User
  5. * @author Andy.Chen
  6. *
  7. */
  8. public class OracleOfUser implements IUser{
  9. public OracleOfUser(){
  10. System.out.println("Oracle工厂:在Oracle中操作User表.");
  11. }
  12. }
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源码:

[html] view plain copy print ?
  1. package com.andyidea.patterns.concreteproduct;
  2. import com.andyidea.patterns.abstractproduct.IDepartment;
  3. /**
  4. * 具体产品角色:Oracle中的Department
  5. * @author Andy.Chen
  6. *
  7. */
  8. public class OracleOfDepartment implements IDepartment{
  9. public OracleOfDepartment(){
  10. System.out.println("Oracle工厂:在Oracle中操作Department表.");
  11. }
  12. }
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源码:

[html] view plain copy print ?
  1. package com.andyidea.patterns.concreteproduct;
  2. import com.andyidea.patterns.abstractproduct.IUser;
  3. /**
  4. * 具体产品角色:SQL Server中的User
  5. * @author Andy.Chen
  6. *
  7. */
  8. public class SQLServerOfUser implements IUser{
  9. public SQLServerOfUser(){
  10. System.out.println("SQL Server工厂:在SQL Server中操作User表.");
  11. }
  12. }
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源码:

[html] view plain copy print ?
  1. package com.andyidea.patterns.concreteproduct;
  2. import com.andyidea.patterns.abstractproduct.IDepartment;
  3. /**
  4. * 具体产品角色:SQL Server中的Department
  5. * @author Andy.Chen
  6. *
  7. */
  8. public class SQLServerOfDepartment implements IDepartment{
  9. public SQLServerOfDepartment(){
  10. System.out.println("SQL Server工厂:在SQL Server中操作Department表.");
  11. }
  12. }
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源码:

[html] view plain copy print ?
  1. package com.andyidea.patterns.concretefactory;
  2. import com.andyidea.patterns.abstractfactory.IDBFactory;
  3. import com.andyidea.patterns.abstractproduct.IDepartment;
  4. import com.andyidea.patterns.abstractproduct.IUser;
  5. import com.andyidea.patterns.concreteproduct.OracleOfDepartment;
  6. import com.andyidea.patterns.concreteproduct.OracleOfUser;
  7. /**
  8. * 具体工厂角色:Oracle工厂
  9. * @author Andy.Chen
  10. *
  11. */
  12. public class OracleFactory implements IDBFactory{
  13. @Override
  14. public IUser createUser() {
  15. return new OracleOfUser();
  16. }
  17. @Override
  18. public IDepartment createDepartment() {
  19. return new OracleOfDepartment();
  20. }
  21. }
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{@Overridepublic IUser createUser() {return new OracleOfUser();}@Overridepublic IDepartment createDepartment() {return new OracleOfDepartment();}}

SQLServerFactory.java源码:

[html] view plain copy print ?
  1. package com.andyidea.patterns.concretefactory;
  2. import com.andyidea.patterns.abstractfactory.IDBFactory;
  3. import com.andyidea.patterns.abstractproduct.IDepartment;
  4. import com.andyidea.patterns.abstractproduct.IUser;
  5. import com.andyidea.patterns.concreteproduct.SQLServerOfDepartment;
  6. import com.andyidea.patterns.concreteproduct.SQLServerOfUser;
  7. /**
  8. * 具体工厂角色:SQL Server工厂
  9. * @author Andy.Chen
  10. *
  11. */
  12. public class SQLServerFactory implements IDBFactory{
  13. @Override
  14. public IUser createUser() {
  15. return new SQLServerOfUser();
  16. }
  17. @Override
  18. public IDepartment createDepartment() {
  19. return new SQLServerOfDepartment();
  20. }
  21. }
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{@Overridepublic IUser createUser() {return new SQLServerOfUser();}@Overridepublic IDepartment createDepartment() {return new SQLServerOfDepartment();}}

3.5 客户端测试类:AbstractFactoryClient.java

[html] view plain copy print ?
  1. package com.andyidea.patterns.client;
  2. import com.andyidea.patterns.abstractproduct.IDepartment;
  3. import com.andyidea.patterns.abstractproduct.IUser;
  4. import com.andyidea.patterns.concretefactory.OracleFactory;
  5. import com.andyidea.patterns.concretefactory.SQLServerFactory;
  6. /**
  7. * 抽象工厂测试类
  8. * @author Andy.Chen
  9. *
  10. */
  11. public class AbstractFactoryClient {
  12. public static void main(String[] args) {
  13. System.out.println("Welcome to Andy.Chen Blog!" +"\n"
  14. +"Abstract Factory Patterns." +"\n"
  15. +"-------------------------------");
  16. IUser oracleUser,sqlUser;
  17. IDepartment oracleDept,sqlDept;
  18. OracleFactory of = new OracleFactory();
  19. SQLServerFactory sf = new SQLServerFactory();
  20. oracleUser = of.createUser();
  21. oracleDept = of.createDepartment();
  22. sqlUser = sf.createUser();
  23. sqlDept = sf.createDepartment();
  24. }
  25. }
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();}
}

【4】程序运行结果:

[html] view plain copy print ?
  1. Welcome to Andy.Chen Blog!
  2. Abstract Factory Patterns.
  3. -------------------------------
  4. Oracle工厂:在Oracle中操作User表.
  5. Oracle工厂:在Oracle中操作Department表.
  6. SQL Server工厂:在SQL Server中操作User表.
  7. SQL Server工厂:在SQL Server中操作Department表.
Welcome to Andy.Chen Blog!
Abstract Factory Patterns.
-------------------------------
Oracle工厂:在Oracle中操作User表.
Oracle工厂:在Oracle中操作Department表.
SQL Server工厂:在SQL Server中操作User表.
SQL Server工厂:在SQL Server中操作Department表.

【5】总结

抽象工厂模式优点:

第一,易于交换产品系列,由于具体工厂类,例如IDBFactory factory = new OracleFactory(),在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它之需要改变具体工厂即可使用不同的产品配置。
第二,它让具体的创建实例与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。

转载于:https://www.cnblogs.com/snake-hand/archive/2012/08/13/2636225.html

设计模式之六 --- 抽象工厂模式(Abstract Factory)相关推荐

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

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

  2. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  3. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  4. Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)

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

  5. 设计模式之抽象工厂模式---abstract factory

    模式的介绍 模式的定义 Provide an interface for creating families of related or dependent objects without speci ...

  6. 设计模式剖析——抽象工厂模式Abstract Factory Pattern

    含义 与工厂方法模式相比,概念有些不一样.有抽象零件.抽象产品.抽象工厂.用零件来组装出产品,组装出的产品才是完整的产品. 既然一个完整产品需要多个零件,那么每种具体工厂自然也需要可以同时生产出多种零 ...

  7. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  8. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  9. 设计模式 - 抽象工厂模式(abstract factory pattern) 详解

    抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916 ...

  10. 抽象工厂模式 Abstract Factory Pattern

    源地址 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建 ...

最新文章

  1. Squid如何提高命中率
  2. G1回收器:我怎么知道你是什么时候的垃圾?
  3. 关于A*寻路算法的认识
  4. solrj 使用记录 - 添加文档
  5. keras中lstm参数_如何使用Keras为自定义NER构建深度神经网络
  6. 限制输入框只能输入数字
  7. 【学习笔记】《数据挖掘:理论与算法》CH5 支持向量机
  8. 不抛弃,不放弃@《士兵突击》
  9. 7-7 整数的分类处理 (20 分)
  10. unity 特效shader下载_Unity shader消融特效——(1)逻辑节点篇
  11. 标准时间标准Time Zone: GMT,UTC,DST,CST
  12. 区块链 Fisco bcos 智能合约(11)-深入浅出Solidity
  13. C#(int)中Convert、Parse、TryParse的区别
  14. Java快递物流运输管理系统源码
  15. centos7设置DNS
  16. 网吧游戏二层更新linux,图文细说网吧游戏更新软件【处理手段】
  17. 【洛谷】P1488 肥猫的游戏(博弈论+全网最详细!!!)
  18. 菜鸟落泪:debian 9 安装 python 库记录
  19. Python 神器,自动识别文字中的省市区并绘图
  20. 日期和身份证年龄计算相关小工具

热门文章

  1. Spring Boot入口类
  2. 虚拟机无法将文件......DVD1.iso作为映像进行连接:找不到该文件
  3. sprk sql自定义UDF函数
  4. 深度学习中收敛是什么意思?
  5. 一文讲清模拟信号、自然信号、数字信号、模拟输入输出
  6. 各大linux发行版安装宝塔桌面脚本
  7. ubuntu 中wget (下载)命令用法
  8. bootstrap49-Bootstrap 分割的按钮下拉菜单
  9. 51nod 1273 旅行计划——思维题
  10. 《Lua游戏开发实践指南》一3.2游戏项目中的Lua