资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2012-2-13,#,设计模式,工厂模式,2012.02,张云波,开闭,原则,对扩展开放,对修改关闭,扩展性,稳定性,简单工厂(,Simple Factory,),提供一个创建对象实例的功能,而无须关心其具体实现。被创建实例的类型可以是接口、抽象类,也可以是具体的类。,类,UML,图,抽象产品,具体产品,2,具体产品,1,工厂,具体产品,2,具体产品,1,产品,1,实例,产品,2,实例,普通实例化,简单工厂实例化,简单工厂中的,参与者,抽象产品,工厂创建的所有产品的父类,负责描述所有实例所共有的公共接口,具体产品,工厂创建的目标,抽象产品的某个具体实例,工厂,实现创建所有实例的内部逻辑,被外调用,创建需要的产品对象,优缺点,优点,实现了客户端和具体实现类的解耦,为系统结构提供了灵活的动态扩展机制,缺点,工厂包含了所有的创建逻辑,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑(通过,反射,解决),不方便扩展子工厂。通常使用静态工厂方法,这使得无法由子类继承,什么时候选择简单工厂,要完全封装,隔离具体实现,选用简单工厂,让客户端通过工厂来获取相应的接口,而无须关心具体的实现。为系统结构提供了灵活的动态扩展机制,集中管理和控制对外创建对象的职责,简单工厂可以创建很多的、不相关的对象,可以把对外创建对象的职责集中到一个简单工厂来,从而实现集中管理和控制。,工厂方法(,Factory Method,),定义一个创建产品对象的,工厂接口,,将实际创建工作推迟到,子类,当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口。,类,UML,图,抽象产品,具体产品,2,具体产品,1,抽象工厂,具体工厂,2,具体工厂,1,工厂方法中的,参与者,抽象产品,所有产品的父类,描述所有实例所共有的公共接口,具体产品,工厂创建的目标,抽象产品的某个具体实例,抽象工厂,工厂方法模式的核心,任何在模式中创建的对象的工厂类必须实现这个接口,具体工厂,实现抽象工厂接口,实现创建所有实例的内部逻辑。被外调用,创建需要的产品对象,优缺点,优点,克服了简单工厂模式违背开放,封闭原则的缺点,又保持了封装对象创建过程的优点,为系统结构提供了灵活的动态扩展机制,缺点,每增加一个产品,就需要增加一个产品工厂的类,增加了额外的开发量,什么时候选择工厂方法,如果一个类需要创建某个接口的对象,但是又不知道具体的实现,这种情况可以选用工厂方法模式,把创建对象的工作延迟到子类去实现,如果一个类本身就希望,由它的子类来创建所需的对象的时候,应该使用工厂方法模式,抽象工厂(,Abstract,Factory,),当有多个抽象角色时,使用的一种工厂模式。,抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。,类,UML,图,抽象产品,1,具体产品,2,具体产品,1,抽象工厂,具体工厂,2,具体工厂,1,抽象产品,2,抽象工厂中的,参与者,抽象产品,多个有相关联系的产品的接口,具体产品,工厂创建的目标,抽象产品的某个具体实例,抽象工厂,工厂方法模式的核心,任何在模式中创建的对象的工厂类必须实现这个接口,具体工厂,实现抽象工厂接口,实现创建所有实例的内部逻辑。被外调用,创建需要的产品对象,优缺点,优点,分离了具体的类。,使得易于交换产品系列,有利于产品的一致性,缺点,难以扩展抽象工厂以生产新种类的产品。,抽象工厂几口确定了可以被创建的产品集合,支持新种类的产品就需要扩展该工厂接口,这将涉及抽象工厂类及其所有子类的改变。,什么时候选择抽象工厂,一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。,这个系统有多于一个的产品族,而系统只消费其中某一产品族。,同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。,系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现,End,
展开阅读全文