创建类模式(二):抽象工厂(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)
简介 抽象工厂模式是创建型模式的一种, 与工厂方法不同的是抽象工厂针对的是生产一组相关的产品, 即一个产品族. 抽象工厂使用工厂方法模式来生产单一产品, 单一产品的具体实现分别属于不同的产品族. 抽象 ...
随机推荐
- UVa 1646 (递推 JAVA大数) Edge Case
题意: 有n个点围成一圈,这n个点的匹配就是没有公共点的边集(这些边只能连接一圈中相邻的两点),求所有匹配的个数. 额,我不会分析..=_=|| 算了几个数,找找规律发现它满足斐波那契数列的递推关系, ...
- LA 4636 (贪心) Cubist Artwok
题意: 一个由若干小正方体组成的图形,给出它的正视图和侧视图,求满足条件的最少小正方体的个数. 分析: 虽说是一道简单的贪心,可一直没有太好的思路. 又一次可耻地看了别人的题解. http://blo ...
- HDU 2087 (KMP不可重叠的匹配) 花布条
题意: 用两个字符串分别表示布条和图案,问能从该布条上剪出多少这样的图案. 分析: 毫无疑问这也是用KMP匹配,关键是一次匹配完成后,模式串应该向后滑动多少. 和上一题 HDU 1686 不同,两个图 ...
- [反汇编练习] 160个CrackMe之002
[反汇编练习] 160个CrackMe之002. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- JOB的创建,定时,执行
--建表 create table test_job(para_date date); commit; insert into test_job values(sysdate); commit; ...
- HDU 5882 Balanced Game
Balanced Game Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- 修改Oracle 表空间名称 tablespace name
修改表空间名称步骤如下: 1. 使用oracle用户登录执行 $sqlplus / as sysdba 2. 执行修改表空间命令如下 SQL> alter tablespace TEST re ...
- Android之APK文件签名——keytool和jarsigner
一.生成密钥库将位置定位在jdk的bin文件中,输入以下命名行:keytool -genkey -alias ChangeBackgroundWidget.keystore -keyalg RSA - ...
- Android欢迎界面的创建方法
1.制作一张启动图片splash.png,放置在res->drawable-hdpi文件夹中.2.新建布局文件splash.xml <?xml version="1.0" ...
- 《C++ primer》--第7章
删除指针后,该指针就变成了悬垂指针.悬垂指针指向曾经存放对象的内存,但该对象已经不再存在了. 习题7.8 举一个例子说明什么时候应该将形参定义为引用类型.再举一个例子说明什么时候不应该将形参定义为引用 ...