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

——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. GCC生成动态库

    main.c #include <stdio.h> void hello(void); int main(int argc, char ** argv) { printf("Th ...

  2. [转]JavaScript文件操作(2)-FileReader

    在上篇文章中,我介绍了在JavaScript操作文件,重点讲了如何取得File对象. 这些对象包含的文件的元数据在上传或者拖放到浏览器中时可以获取到.有了文件当然接下来就是读取文件了. FileRea ...

  3. 使用Visual Studio进行单元测试-Part2

    写在开头:Coding ain't done until all the tests run. No unit test no BB. 另外有童鞋在上一篇博文留言说找不到Add Fake Assemb ...

  4. 2006浙大火星A+B

    题目描述:     读入两个不超过25位的火星正整数A和B,计算A+B.需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数.例如:地球上的10进制数2,在火星上记为“1,0”,因为 ...

  5. UE3优化

    转自:http://www.cnblogs.com/NEOCSL/p/3320510.html 优化问题有很多内容可讲,涉及林林总总.今天我总结一下优化注意的地方. 1.从AnimTree和Skele ...

  6. 一 Akka学习 - actor

    (引用 http://shiyanjun.cn/archives/1168.html) 一: 什么是Akka? Akka是JAVA虚拟机JVM平台上构建高并发.分布式和容错应用的工具包和运行时,是一个 ...

  7. Convolutional Neural Networks 笔记

    1 Foundations of Convolutional Neural Networks 1.1 cv问题 图像分类.目标检测.风格转换.但是高像素的图片会带来许多许多的特征. 1.2 边缘检测( ...

  8. CentOS7 搭建LNMP

    一.        安装依赖文件 1.  sudo yum install gcc gcc-c++ zlib zlib-devel libxml2 libxml2-devel openssl open ...

  9. [51nod1138]正整数分解为几个连续自然数之和

    解题关键:注意为什么上界是$\sqrt {2n} $ 因为函数是关于m的递减函数,而结果必须为正整数 $a = \frac{{2n + m - {m^2}}}{{2m}} = \frac{n}{m} ...

  10. CSS学习系列4 -- 再说CSS中的浮动运用及clear:left/right实际用法

    在 CSS学习系列2 -- CSS中的清除浮动 中,我们详细说了CSS中清除浮动的方法及使用 后来我自己在项目开发一个需要使用浮动的网页时,进行了实际运用,加上后来看到一篇好文章.所以就在这里再次写篇 ...