设计模式之抽象工厂

来源:互联网 发布:php mysql 开启预编译 编辑:程序博客网 时间:2024/06/11 14:00
动机:

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

意图:

提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们具体的类——《设计模式》GoF

Abstract Factroy模式的几个要点:

1、如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factroy模式,这时候使用简单静态工厂完全可以。
2、“系列对象”指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖。
3、Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。
4、Abstract Factory模式经常和Factroy Method模式共同组合来应对“对象创建”的需求变化。

Abstract Factory结构图:

                                             

代码示例:

游戏场景分为古典、现代,游戏场景响应的接口:

public abstract class Road{public abstract void road();}public abstract class Building{public abstract void build();}public abstract class Tunnel{public abstract void tunnel();}public abstract class Jungle{public abstract void jungle();}public abstract class MethodFactory{public abstract Road creatRoad();public abstract Building creatBuilding();public abstract Tunnel creatTunnel();public abstract Jungle creatJungle();}

现代场景的创建:

public class ModernRoad extends Road{@Overridepublic void road() {// TODO Auto-generated method stubSystem.out.println("ModernRoad");}}public class ModernBuilding extends Building{@Overridepublic void build() {// TODO Auto-generated method stubSystem.out.println("ModernBuilding");}}public class ModernTunnel extends Tunnel{@Overridepublic void tunnel() {// TODO Auto-generated method stubSystem.out.println("ModernTunnel");}}public class ModernJungle extends Jungle{@Overridepublic void jungle() {// TODO Auto-generated method stubSystem.out.println("ModernJungle");}}public class ModernMehodFatory extends MethodFactory{@Overridepublic Road creatRoad() {// TODO Auto-generated method stubreturn new ModernRoad();}@Overridepublic Building creatBuilding() {// TODO Auto-generated method stubreturn new ModernBuilding();}@Overridepublic Tunnel creatTunnel() {// TODO Auto-generated method stubreturn new ModernTunnel();}@Overridepublic Jungle creatJungle() {// TODO Auto-generated method stubreturn new ModernJungle();}}

使用场景:

1、QQ换肤

 2、数据库访问程序设计,不同的数据库访问方式可能不一样。

拓展连接:http://liuling123.com/2013/02/design-partten-factory.html

0 0