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

——DP

UML类图

模式说明

抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工厂强调的是要能创建多个对象,而且这些对象间有某种联系。例如我们系统提供了对SQL和Oracle两种数据库的支持,因此对于产品类和订单类,就有两种不同的实现。

产品类的实现:

    /// <summary>
/// 抽象业务模型(产品)
/// </summary>
abstract class Product
{
public string Name { get; set; } public abstract void Save();
} /// <summary>
/// 产品模型(针对Oracle实现)
/// </summary>
class ProductWithOracle:Product
{
public override void Save()
{
Console.WriteLine("保存产品信息到Oracle");
}
}
/// <summary>
/// 产品模型(针对SQL实现)
/// </summary>
class ProductWithSql : Product
{
public override void Save()
{
Console.WriteLine("保存产品信息到SQL");
}
}

订单类的实现:

    /// <summary>
/// 抽象业务模型(订单)
/// </summary>
abstract class Order
{
public int Id { get; set; }
public abstract void Save();
} /// <summary>
/// 订单模型(针对Oracle实现)
/// </summary>
class OrderWithOracle:Order
{
public override void Save()
{
Console.WriteLine("保存订单信息到Oracle");
}
}
/// <summary>
/// 订单模型(针对SQL实现)
/// </summary>
class OrderWithSql:Order
{
public override void Save()
{
Console.WriteLine("保存订单信息到SQL");
}
}

下面定义一个用于创建产品和订单的工厂接口:

    /// <summary>
/// 抽象工厂接口
/// </summary>
interface IFactory
{
Product CreateProduct();
Order CreateOrder();
}

提供SQL工厂的实现:

    /// <summary>
/// SQL工厂
/// </summary>
class SqlFactory:IFactory
{
public Product CreateProduct()
{
return new ProductWithSql();
} public Order CreateOrder()
{
return new OrderWithSql();
}
}

提供Oracle工厂的实现:

    /// <summary>
/// Oracle工厂
/// </summary>
class OracleFactory : IFactory
{
public Product CreateProduct()
{
return new ProductWithOracle();
} public Order CreateOrder()
{
return new OrderWithOracle();
}
}

客户端在决定使用何种数据库后,就可以用抽象工厂来创建针对这一数据库版本的具体业务对象了:

            IFactory factory = new OracleFactory();

            factory.CreateOrder().Save();
factory.CreateProduct().Save();

总结

抽象工厂主要是为了创建一系列相关(或相互依赖)的对象,如上文中的产品类和订单类,要么都是针对SQL数据库的,要么都是针对Oracle数据库的。如果此处用工厂方法模式,就有可能存在这种情况:用户用产品工厂创建了针对SQL的产品类,但却用订单工厂创建了针对Oracle的订单类,假如我们的系统在运行时只支持一种库,那么就留下严重的BUG,而此处用抽象工厂模式,就不会存在创建出的一系列对象间不协调的问题。

参考

  1. 程杰老师  《大话设计模式》

设计模式——抽象工厂(Abstract Factory)的更多相关文章

  1. 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)

    在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...

  2. 面向对象设计——抽象工厂(Abstract Factory)模式

    定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...

  3. 设计模式四: 抽象工厂(Abstract Factory)

    简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...

  4. 【设计模式】——抽象工厂Abstract Factory

    模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...

  5. 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式

    趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...

  6. 工厂模式[3] 抽象工厂 Abstract Factory

    简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...

  7. C2:抽象工厂 Abstract Factory

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 应用场景: 一系列相互依赖的对象有不同的具体实现.提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合 UM ...

  8. Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式

    一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...

  9. Headfirst设计模式的C++实现——抽象工厂(Abstract Factory)

    Dough.h #ifndef _DOUGH_H #define _DOUGH_H class Dough { }; #endif ThinCrustDough.h #ifndef _THIN_CRU ...

随机推荐

  1. 4445: [Scoi2015]小凸想跑步 半平面交

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4445 题解: 设点坐标,利用叉积可以解出当p坐标为\((x_p,y_p)\)时,与边i- ...

  2. RTSP 协议分析 (一)

    RTSP 协议分析1.概述: RTSP(Real Time Streaming Protocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学.网景和RealNetwor ...

  3. 拓扑排序 POJ 1094 Sorting It All Out

    题意:给定N个字和M行他们之间的关系,要求输出他们的拓扑排序.此题采用边输入边检测的方式,如果发现环,就结束并输出当前行号:如果读取到当前行时,可以确定拓扑序列就输出,不管后面的输入(可能包含环路): ...

  4. JUST第二界算法设计大赛题解

    1.问题描述: 悠悠假期同叔叔一起去书店,他选中了六本书,每本书的单价(单位:元)分别为:3.1,1.7,2,5.3,0.9 和7.2.不巧的是,叔叔只带了十几块钱,为了让悠悠高兴,叔叔同意买书,但提 ...

  5. mina中的发送延时

    由于项目需要,用到了 mina 框架进行 tcp 通讯.我是初次接触 mina,于是从 Hello world 开始学习了 mina .期间遇到了一个奇怪的发送数据的延迟问题,解决的过程是曲折的,但找 ...

  6. ceph-deploy mon add 失败

    ceph-deploy mon add 失败 标签(空格分隔): ceph-deploy 运维 问题描述: 现有集群只有一个mon,需要通过ceph-deploy mon add添加两个mon.在ad ...

  7. Linux如何打开执行脚本

    命令行下例如要打开startmysql.sh就直接 sh /目录/目录当前界面下就简单了在这个SH文件目录下打开终端 输入 sh startmysql.sh 回车或者对这个文件右键 打开 选择“在终端 ...

  8. 继承自DynamicObject的对象的Xml序列化

    默认情况下,对继承自DynamicObject的对象进行序列化操作是不会报错的,但是并没有实际序列化出任何东西来 为了让它进行序列化,我们改造一下实现类,实现IXmlSerializable接口 代码 ...

  9. BadImageFormatException,未能加载正确的程序集XXX的解决办法

    BadImageFormatException,未能加载正确的程序集XXX的解决办法 IDE:VS2010 语言:C# 异常:System.BadImageFormatException,未能加载正确 ...

  10. 8、linux-数字计算

    bash内置了对整数四则运算的支持,但是并不支持浮点运算 bc命令是一种支持任意精度的交互执行的计算器语言,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下 在bc工作环境下,可以使用以下计 ...