GOF《设计模式》一书对Abstract Factory模式是这样描述的:
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
大致意思是说:我们在创建这些对象的时候,并不需要指定它们的具体类,这些具体类的对象是由工厂对象负责实例化的。下面是《Design Patterns Explained》一书的例子,有关计算机系统的显示和打印程序,用来显示和打印的分辨率取决于当前运行的系统。低端机使用低分辨率的显示和打印驱动程序,高端机使用高分辨率的显示和打印驱动程序。其结构图如下:
代码如下:
abstract class ResFactory{
abstract public DisplayDriver getDisplayDrvr();
abstract public PrintDriver getPrintDrvr();
}
class LowResFact extends ResFactory{
public DisplayDriver getDisplayDrvr() {
returnnew LRDD();
}
public PrintDriver getPrintDrvr() {
returnnew LRPD();
}
}
class HighResFact extends ResFactory{
public DisplayDriver getDisplayDrvr() {
returnnew HRDD();
}
public PrintDriver getPrintDrvr() {
returnnew HRPD();
}
}
abstract class DisplayDriver{
}
abstract class PrintDriver{
}
class HRDD extends DisplayDriver{
public HRDD() {
System.out.println("使用高端机的显示驱动程序")
}
}
class LRDD extends DisplayDriver{
public LRDD(){
System.out.println("使用低端机的显示驱动程序");
}
}
class HRPD extends PrintDriver{
public HRPD() {
System.out.println("使用高端机的打印驱动程序");
}
}
class LRPD extends PrintDriver{
public LRPD() {
System.out.println("使用低端机的打印驱动程序");
}
}
public class ApControl {
public static ResFactory getResFactory(ResFactory factory){
return factory;
}
public static void main(String[] args) {
ResFactory highResFact=ApControl.getResFactory(new HighResFact());
highResFact.getDisplayDrvr();
highResFact.getPrintDrvr();
ResFactory lowResFact=ApControl.getResFactory(new LowResFact());
lowResFact.getDisplayDrvr();
lowResFact.getPrintDrvr();
}
}输出结果:
使用高端机的显示驱动程序
使用高端机的打印驱动程序
使用低端机的显示驱动程序
使用低端机的打印驱动程序
在这个例子中ApControl使用派生自两个不同的服务类(DisplayDriver和PrintDriver)的对象。这个设计非常简化,隐藏了实现细节,系统的可维护性也更好。ApControl不知道自己拥有的服务对象的那个特定具体实现,因为创建对象是工厂的职责。ApControl也不知道自己使用的是哪个特定工厂,因为它只知道自己有一个ResFactory对象。它可能是一个HighResFact也可能是一个LowResFact,但它不知道到底是哪一个。
小结:在必须协调一组对象的创建时,可以应用Abstract Factory模式。它提供了一种方式,将如何执行对象实例化的规则从使用这些对象的客户对象中提取出来。首先,找出实例化的规则,定义了一个带接口的抽象类,其中的接口为每种需要实例化的对象提供一个方法。然后,从这个类为每个组实现具体类。最后,由客户对象决定使用具体工厂来创建所需的对象。它主要适用于以下几种情况:
1) 一个系统要独立于它的产品的创建、组合和表示时。
2) 可以对系统进行配置,以便系统可以使用多个产品系列中的某一个。
3) 当需要强调一系列相关产品对象的设计以便进行联合使用时。
4) 当希望提供一个产品类库,而只想显示他们的接口而不是实现时。
<script type="text/javascript"></script>
- 大小: 32.5 KB
分享到:
相关推荐
《C++20设计模式》学习笔记-第3章工厂方法和抽象工厂模式学习代码
设计模式学习笔记,分析了GOF的23种模式和类设计的原则
Java设计模式学习笔记
我收集的设计模式的学习笔记,采用pdf格式,便于收藏和查看
各个模式都有详细的例子C#学习笔记,打开就知道了
设计模式学习笔记(一)--简单工厂模式源码和类图
HeadFirst设计模式学习笔记比较全面详细地讲解了13个设计模式,有利于大家更好的学习HeadFirst设计模式,希望亲们会喜欢~~~
总结了java开发中的21种设计模式,详解和例子,带书签的pdf格式,方便阅读!
设计模式学习笔记.ppt 自己写的一点学习笔记。
设计模式学习笔记,总共23个设计模式,还有几个设计原则
23种设计模式学习笔记及源码,全部原创 欢迎提出意见和建议
Head First 设计模式学习笔记。更多内容请参见文章内容。
学习Java设计模式的笔记,标注了其中重要的要点,如果有需要的小伙伴,自行下载哦
设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx设计模式学习笔记--Flyweight享元模式.docx
共150讲,时长共 33...1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括...
代理模式学习笔记、单例模式学习笔记、命令模式、原型模式、模式特点总结。 为个人对设计模式的理解,如果有理解不一致的不要砸砖啊
设计模式学习笔记-命令模式
学习设计模式入门的好材料 简单明了,一看就懂 帮助你快速学习或是复习23种设计模式
Head.First 设计模式学习笔记.pdf Head.First 设计模式学习笔记.pdf
3.设计模式Design Pattern:创建型模式(厂模式Factory、抽象工厂模式Abstract Factory、单例模式Singleton、建造者模式Builder、原型模式Prototype和对象池模式Object Pool Pattern)、结构型模式(适配器模式、...