abstract Factory模式

原创 2007年09月12日 14:25:00

创建型的模式 

对于需要根据上下文进行文件创建的情况,将创建一组含有达到相同任务目标的对象的过程进行封装,使之与调用者解耦

典型的例子是
一个控制操作系统显示,并打印图像的程序

驱动程序 在低配置机器上 在高配置机器上
显示 使用低分辨率驱动程序 使用高分辨率驱动程序
打印 使用低分辨率打印程序 使用低分辨率打印程序

采用swtich语句来选择程序流程的话:
public void Disp(){
  swtich(系统环境){
    case LOW:
      // 低分辨率驱动
    case HIGH:
      // 高分辨率驱动
  }
}

public void Print(){
  swtich(系统环境){
    case LOW:
      // 低分辨率驱动
    case HIGH:
      // 高分辨率驱动
  }
}

这里的问题是,驱动程序的选择与实际使用混杂在一起,如果需要修改或者添加一个新的驱动模式,不得不在程序的各个角落修改代码

使用FACTORY模式来分离驱动程序的选择
// 将驱动程序独立开
class DispDriver{
 void Disp();
}
class LowDisp extends DispDriver{
 void Disp() { // Disp low };
}
class HighDisp extends DispDriver{
 void Disp() { // Disp high };
}

class PrintDriver{
 void Print();
}
class LowPrint extends PrintDriver{
 void Print() { // Print low };
}
class HighPrint extends PrintDriver{
 void Print() { // Print high };
}

// 用来返回对应驱动程序的工厂
class DriverFactory{
 DispDriver getDispDriver();
 PrintDriver getPrintDriver();
}
class LowDriverFactory{
 DispDriver getDispDriver(){ return new LowDisp() };
 PrintDriver getPrintDriver(){ return new LowPrint() };
}
class HighDriverFactory{
 DispDriver getDispDriver(){ return new LowDisp() };
 PrintDriver getPrintDriver(){ return new LowPrint() };
}
对象的创建现在由工厂负责,客户代码只需要知道自己使用的DispDriver抽象和PrintDriver抽象
现在的问题只剩下应该使用哪个具体的工厂
可以使用一个配置文件(或者其他数据源) ,"告诉" Factory该使用创建哪个具体
switch ( 配置 )
case LOW:
  DriverFactory  df  = new LowDriverFactory();
case HIGH:
 DriverFactory  df  = new HighDriverFactory();
}
  // 更进一步的做法是使用class的反射来确定使用哪个工厂


客户代码不需要关心了解具体的对象创建过程,甚至不需要了解具体使用了哪个工厂
public void Disp(){
  DispDriver dd = df.Disp();
}
public void Print(){
  PrintDriver pd = df.Print();
}

看上去新的代码同样使用了SWTICH来确定对象使用,但两者并不相同
abstract factory模式下, swtich与系统本身并不耦合,能够被很容易的修改
原情况下,多个swtich使用同一个变量作为开关变量,使之相互依赖,带来复杂和BUG

abstract factory模式用来将 "使用哪些对象" 的规则与 "如何使用这些对象"的逻辑分离开

书籍参考:<设计模式解析>

设计模式:Abstract Factory和Builder(比较区别,个人认为讲得很明白)

如果说 Factory和Prototype是同一个层次的话,那么Abstract Factory和Builder就是更高一级的层次。 1 Abstact Factory   在上面的Factory类型...
  • lovingprince
  • lovingprince
  • 2007年04月17日 10:59
  • 4223

Factory Method vs Abstract Factory

Factory Method vs Abstract Factory
  • u010373266
  • u010373266
  • 2016年12月20日 16:26
  • 313

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

要想正确的理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 抽象设计模式概念:         针对抽象工厂这个设计模式,我查找了不少资料,感觉只有涉及产品级别和产品族的才是理解了抽象工厂设...
  • u012909091
  • u012909091
  • 2014年08月02日 16:52
  • 3590

设计模式之abstract factory篇(例子)

  Design Pattern II: Abstract Factory举例:有BMW和BENZ两家汽车工厂,他们都生产Wheel,Body,Engine。只不过生产出来的一个叫BMWWheel, ...
  • haiyan0106
  • haiyan0106
  • 2007年06月11日 21:16
  • 610

Abstract Factory Pattern(抽象工厂模式)——《深入浅出设计模式(C#/Java版)》

来源:《深入浅出设计模式(C#/Java版)》 莫勇腾 编著哎,似乎越看越觉得糊涂了,先积累吧定义:  提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂(Abstract ...
  • bydxyj
  • bydxyj
  • 2009年09月25日 14:47
  • 830

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

本文可以和笔者的深入浅出设计模式 ------ Factory Method(工厂方法)参照着看, 可以区分这三个工厂模式的不同。...
  • wenniuwuren
  • wenniuwuren
  • 2015年01月29日 02:25
  • 1720

C#设计模式---抽象工厂(Abstract Factory)

意图          提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。   场景          还是上次说的那个网络游戏,定下来是一个休闲的FPS游戏。和CS差不...
  • zhengluanfeng1985
  • zhengluanfeng1985
  • 2017年03月16日 21:58
  • 117

设计模式 - 抽象工厂模式(abstract factory pattern) 详解

抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916...
  • u012515223
  • u012515223
  • 2014年05月26日 16:52
  • 2154

抽象工厂模式(abstract)创建型模式 c#简单例子

抽象工厂模式(abstract)创建型模式 c#简单例子 适用于玩家用户数play1、play2....有变化,而行为move、jum无变化时...
  • zhgl7688
  • zhgl7688
  • 2014年12月11日 19:18
  • 899

Design Pattern - Abstract Factory Pattern

Abstract Factory patterns work around a super-factory which creates other factories. This factory is...
  • likaiwalkman
  • likaiwalkman
  • 2015年05月13日 12:09
  • 211
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:abstract Factory模式
举报原因:
原因补充:

(最多只允许输入30个字)