现在的位置: 首页 > 综合 > 正文

abstract Factory模式

2013年12月19日 ⁄ 综合 ⁄ 共 1601字 ⁄ 字号 评论关闭

创建型的模式 

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

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

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

采用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模式用来将 "使用哪些对象" 的规则与 "如何使用这些对象"的逻辑分离开

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

抱歉!评论已关闭.