抽象工厂模式是一种在动态语言中不太常用的创建型设计模式,它的别名是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
分享到:
相关推荐
:hot_beverage: 用Java实现的设计模式〜 ... :check_mark:抽象工厂模式( Abstract Factroy Pattern ) :memo: , :check_mark:建造者模式( Builder Pattern ) :memo: , :check_mark:单例模式( S
springcloud dubbo
重量分拣仿真项目,博途1500程序及设计说明,Factory IO场景 在这个场景中我们需要实现通过此部分的物料可以被测重并通过中间的分拣装置分拣到三个方向的传送带上面。控制柜需要实现手动单次分拣与自动多次分拣的...
内含官网出厂固件: 1. TX12_Factory SDCARD include firmware and EEPROM.zip 2. multi-cc2500-v1.3.2.6.bin 3. opentx-tx12-en-2.3.11-otx.bin
Factory. IO工厂结合西门子博途v16做的一个仿真控制。 有电气图纸+Factory仿真软件+博途程序+博途v16安装包,需要可以直接联系。 程序安全可靠,学习借鉴必备资料。
依赖注入基于工厂的依赖项注入模式的实现。 数据(重新)注入(类似于依赖项)可以将数据注入Java对象中。 支持OOP并避免OR映射或外部配置文件。 允许在运行时优化(部分)重新配置。 关键概念 为什么要使用...
Setup+Factory是一中JAVA的打包工具 很好能的啊
FactoryIO 2.5.0软件支持仿真驱动