论坛首页 编程语言技术论坛

设计模式与动态语言 之 抽象工厂模式 abstract factroy

浏览 2319 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-07   最后修改:2010-01-07
抽象工厂模式是一种在动态语言中不太常用的创建型设计模式,它的别名是kit

概述:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类

动机:
考虑一个支持多种视感(look-and-feel)标准的用户界面工具包。
不同的视感风格为诸如滚动条、窗口和按钮等用户界面“窗口组件”定义不同的外观和行为。
为保证视感风格标准间的可移植性,一个应用不应该为一个特定的视感外观硬编码它的窗口组件。
在整个应用中实例化特定视感风格的窗口组件类将使得以后很难改变视感风格。

结构:


适用性:
  • 一个系统要独立于它的产品的创建、组合和表示时;
  • 一个系统要由多个产品系列中的一个来配置时;
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时;
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现。



动态性:

ActiveRecord中 从 database.yml 配置得到
是OracleConnection 类还是 MysqlConnection类就是一种工厂模式。


效果:
  • 分离了具体的类;
  • 使得易于交换产品系统;
  • 有利于产品的一致性。


缺点:难以支持新种类的产品。


例子:

class AbstractFactory
  def create_cls(name)
    raise 'Abstract not access.'
  end
end

class Factory < AbstractFactory
  def create_cls(name)
    # On rails has name.constantize
    eval(name)
  end
end

class AbstractPrdA
  attr_accessor :name
  def initialize(name)
    @name = name || self.class.name
  end
end

class PrdA1 < AbstractPrdA
end

class PrdA2 < AbstractPrdA
end

class AbstractPrdB
  attr_accessor :name
  def initialize(name)
    @name = name || self.class.name
  end
end

class PrdB1 < AbstractPrdB
end

class PrdB2 < AbstractPrdB
end

puts Factory.new.create_cls('PrdA1').name
puts Factory.new.create_cls('PrdA2').name
puts Factory.new.create_cls('PrdB1').name
puts Factory.new.create_cls('PrdB2').name


类图:





源码及UML点击下载
  • 大小: 67 KB
  • 大小: 31.5 KB
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics