创建类模式(二):抽象工厂(Abstract Factory)
定义
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
产品族
抽象工厂模式中,引入了产品族的概念,什么是产品族呢?
比如轿车和SUV这两种类型的汽车,属于两种不同类型的结构(即产品等级结构),而奔驰和宝马这两个汽车制造品牌,则属于两种不同的品牌,而这里的品牌我们就可以看做产品族的概念。
奔驰和宝马毫无疑问的都会生产轿车和SUV,那么奔驰轿车和宝马轿车、奔驰SUV和宝马SUV属于两个不同类型的结构(即不同的产品等级结构),而奔驰轿车和奔驰SUV、宝马轿车和宝马SUV属于两个不同类型的产品族。
和工厂方法模式的区别
- 每一个模式都是针对一定问题的解决方案,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式针对的是多个产品等级结构。
- 即如果工厂的产品全部属于同一个等级结构,则属于工厂方法模式;如果工厂的产品来自多个等级结构,则属于抽象工厂模式。
- 还是以上面的例子来看:如果一个工厂根据不同的参数提供奔驰轿车和宝马轿车,则他属于工厂方法模式,因为其提供的是同一个接口下同一个等级结构的对象;而如果一个工厂提供奔驰轿车和奔驰SUV,那么这个工厂模式就是抽象工厂模式,因为他提供的产品是分属两个不同的接口下的不同的等级结构对象。
UML

优点
- 抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
- 当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
- 增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点
- 增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性。
应用场景
- 系统不依赖于产品类实例如何被创建,组合和表达的细节;
- 系统的产品有多于一个的产品族,而系统只消费其中某一族的产品;
- 同属于同一个产品族是在一起使用的。这一约束必须在系统的设计中体现出来;
- 系统提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖于实现。
示例
一个简单的奔驰和宝马生产流水线。
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)的更多相关文章
- 工厂模式[3] 抽象工厂 Abstract Factory
简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...
- 抽象工厂(Abstract Factory),工厂方法(Factory Method),单例模式(Singleton Pattern)
在谈工厂之前,先阐述一个观点:那就是在实际程序设计中,为了设计灵活的多态代码,代码中尽量不使用new去实例化一个对象,那么不使用new去实例化对象,剩下可用的方法就可以选择使用工厂方法,原型复制等去实 ...
- 创建型模式(三) 抽象工厂模式(Abstract Factory)
一.动机(Motivation) 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时,由于需求的变化,往往存在更多系列对象的创建工作. 如何应对这种变化?如何绕过常规的对象创建方法(ne ...
- 5、抽象工厂 abstract factory 将关联组件组成产品 创建型模式
趁热打铁,紧跟着上一节的工厂方法模式.这一节介绍一下抽象工厂模式,以及分析俩个模式的不同 1.何为抽象模式? 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他 ...
- Java设计模式(3)——创建型模式之抽象工厂模式(Abstract Factory)
一.概述 抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式.抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象. UML图: 其他的过多概念不再 ...
- 面向对象设计——抽象工厂(Abstract Factory)模式
定义 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类.抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道或关心实际产出的具体产品是什么.这样一来,客户就能从具体的产 ...
- 设计模式——抽象工厂(Abstract Factory)
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类. ——DP UML类图 模式说明 抽象工厂与工厂方法在定义上最明显的区别是“创建一系列相关或相互依赖对象的接口”,由此可以看出抽象工 ...
- .NET设计模式 第二部分 创建型模式(2)—抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作:同时由于需求的变 ...
- Java 工厂模式(一)— 抽象工厂(Abstract Factory)模式
一.抽象工厂模式介绍: 1.什么是抽象工厂模式: 抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态,抽象工厂模式向客户端提供一个接口,使得客户端在不知道具体产品的情类型的情况下,创建 ...
- 设计模式四: 抽象工厂(Abstract Factory)
简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...
随机推荐
- bzoj4080
分组赛时wy大神讲的题,网上都是随机化的题解 我来讲一下正解吧,我们穷举两个点,这两点距离要小于限制 然后我们分别以这两个点为圆心,两点距离为半径画圆 圆圆相交的部分被两点练成线段划分成两部分,不难发 ...
- uva12230Crossing Rivers
数学期望. 过每条河的时间的可能在[L/v,3*L/v]间均匀分布,数学期望为2*L/v. 然后在加上在陆上走的时间. #include<cstdio> #include<algor ...
- UVa 11489 (博弈) Integer Game
一个数字能被3整除就等价于这个数的各个数字之和被3整除. 所以一开始的时候先要拿一个能使剩下的数字是3的倍数的数. 然后就一直拿0.3.6.9直到某人不能再拿为止. #include <cstd ...
- 解决编译报错:Unable to copy file, because it is being used by another process.
Error 63 Unable to copy file "D:\DEV\XXX Website\trunk\4 Source Code\Common\WebControls\b ...
- JetBrains优秀工具推荐
1.JAVA开发工具 IDEA IDEA 全称 IntelliJ IDEA,是Java语言开发的集成环境,IntelliJ在业界被公认为最好的Java开发工具之一,尤其在智能代码助手.代码自动提示.重 ...
- 在web.config里使用configSource分隔各类配置
转:http://www.yongfa365.com/Item/using-configSource-Split-Configs.html 大型项目中,可能有多个Service,也就是会有一堆配置,而 ...
- Oracle行列互换 横表和纵表
/* 在实际使用sql工作中总会碰到将某一列的值放到标题中显示.就是总说的行列转换或者互换. 比如有如下数据: ID NAME KECHENG CHENGJI -- ---------- ------ ...
- 未能加载文件或程序集“Oracle.DataAccess, Version=2.112.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342"
转载自原文 未能加载文件或程序集"Oracle.DataAccess, Version=2.112.1.0,..." 若本机的Oracle版本是32位系统,则在调用Oracle数据 ...
- MySQL数据库分布式事务XA优缺点与改进方案
1 MySQL 外部XA分析 1.1 作用分析 MySQL数据库外部XA可以用在分布式数据库代理层,实现对MySQL数据库的分布式事务支持,例如开源的代理工具:ameoba[4],网易的DDB,淘宝的 ...
- Java SE 6 新特性: 对脚本语言的支持
2006 年底,Sun 公司发布了 Java Standard Edition 6(Java SE 6)的最终正式版,代号 Mustang(野马).跟 Tiger(Java SE 5)相比,Musta ...