浏览 2318 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-07
最后修改:2010-01-07
概述:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(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点击下载 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |