定义

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

抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。

产品族

抽象工厂模式中,引入了产品族的概念,什么是产品族呢?

比如轿车和SUV这两种类型的汽车,属于两种不同类型的结构(即产品等级结构),而奔驰和宝马这两个汽车制造品牌,则属于两种不同的品牌,而这里的品牌我们就可以看做产品族的概念。

奔驰和宝马毫无疑问的都会生产轿车和SUV,那么奔驰轿车和宝马轿车、奔驰SUV和宝马SUV属于两个不同类型的结构(即不同的产品等级结构),而奔驰轿车和奔驰SUV、宝马轿车和宝马SUV属于两个不同类型的产品族。

和工厂方法模式的区别

  1. 每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
  2. 即如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。
  3. 还是以上面的例子来看:如果一个工厂根据不同的参数提供奔驰轿车和宝马轿车,则他属于工厂方法模式,因为其提供的是同一个接口下同一个等级结构的对象;而如果一个工厂提供奔驰轿车和奔驰SUV,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的接口下的不同的等级结构对象。

UML

优点

  1. 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
  2. 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
  3. 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。

缺点

  1. 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。

应用场景

  1. 系统不依赖于产品类实例如何被创建,组合和表达的细节;
  2. 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;
  3. 同属于同一个产品族是在一起使用的。这一约束必须在系统的设计中体现出来;
  4. 系统提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于实现。

示例

一个简单的奔驰和宝马生产流水线。

Java

 public class Main
{
public static void main(String[] args)
{
IFactory factory;
//奔驰流水线开动了
factory = new BenzFactory();
factory.createSaloon().startEngine();
factory.createSUV().startEngine();
//宝马流水线开动了
factory = new BmwFactory();
factory.createSaloon().startEngine();
factory.createSUV().startEngine();
} /**
* 轿车接口
*/
public static interface ISaloonCar
{
public void startEngine();
} /**
* SUV接口
*/
public static interface ISUVCar
{
public void startEngine();
} /**
* 奔驰轿车
*/
public static class BenzSaloonCar implements ISaloonCar
{
public void startEngine()
{
System.out.println("奔驰轿车发动了!");
}
} /**
* 奔驰SUV
*/
public static class BenzSUVCar implements ISUVCar {
public void startEngine() {
System.out.println("奔驰SUV发动了!");
}
} /**
* 宝马轿车
*/
public static class BmwSaloonCar implements ISaloonCar
{
public void startEngine()
{
System.out.println("宝马轿车发动了!");
}
} /**
* 宝马SUV
*/
public static class BmwSUVCar implements ISUVCar
{
public void startEngine()
{
System.out.println("宝马SUV发动了!");
}
} /**
* 汽车生产线工厂接口
*/
public static interface IFactory
{
ISaloonCar createSaloon(); ISUVCar createSUV();
} /**
* 奔驰牌轿车工厂
*/
public static class BenzFactory implements IFactory
{
public ISaloonCar createSaloon()
{
return new BenzSaloonCar();
} public ISUVCar createSUV()
{
return new BenzSUVCar();
}
} /**
* 宝马牌轿车工厂
*/
public static class BmwFactory implements IFactory
{
public ISaloonCar createSaloon()
{
return new BmwSaloonCar();
} public ISUVCar createSUV()
{
return new BmwSUVCar();
}
}
}

创建类模式(二):抽象工厂(Abstract Factory)的更多相关文章

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

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

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

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

  3. 创建型模式(三) 抽象工厂模式(Abstract Factory)

    一.动机(Motivation) 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 如何应对这种变化?如何绕过常规的对象创建方法(ne ...

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

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

  5. Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)

    一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...

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

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

  7. 设计模式——抽象工厂(Abstract Factory)

    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...

  8. .NET设计模式 第二部分 创建型模式(2)—抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变 ...

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

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

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

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

随机推荐

  1. ASP.NET MVC 学习3、Controller左手从Model获取数据,右手传递到View页面

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-dat ...

  2. ios 编译openssl支持arm64(转)

    最近在编译支付宝 快捷支付(无线) ios 端的时候发现demo不支持arm64.在网上找了下,看到客服说是openssl的库文件不支持arm64,于是自己编译了支持arm64的库文件,发现还是不行, ...

  3. Linux find xargs rm .orig

    /********************************************************************* * Linux find xargs rm .orig * ...

  4. Android Dialog使用举例

    在Android开发中,我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框,在我们使用Android的过程中,我归纳了一 ...

  5. UVa 11300 Spreading the Wealth 分金币

    圆桌旁坐着 n 个人,每个人都有一定数量的金币,金币总数能够被 n 整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值,比如 n = 4, ...

  6. Android的图片压缩并上传

    Android开发中上传图片很常见,一般为了节省流量会进行压缩的操作,本篇记录一下压缩和上传的方法. 图片压缩的方法 : import java.io.ByteArrayOutputStream; i ...

  7. android下ListView的奇异异常大集合(持续更新)

    使用ListView的addFooterView或者addHeaderView报错或者不知名的异常:at android.widget.ListView.clearRecycledState(List ...

  8. (1)java设计模式之简单工厂模式

    一:简单工厂模式的优点          --->在阎宏博士的<JAVA与模式>一书中开头是这样描述简单工厂模式的:简单工厂模式是类的创建模式,又叫做静态工厂方法(Static Fa ...

  9. Delphi or函数的用法

    function GetFlag(a: string): Integer;var I: Integer;begin Result := 0; for I := 0 to 3 - 1 do begin ...

  10. android学习笔记五

    Android中的category大全 Api Level 3(SDK 1.5)和Api Level 4(SDK 1.6): android.intent.category.ALTERNATIVE a ...