在软件系统中,经常面临着”一系列相互依赖的对象“的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规对象创建方法,提供一种”封装机制“来避免客户程序和这种“多系列”具体对象创建工作的紧耦合。
意图:
提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定他们具体的类——《设计模式》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{
@Override
public void road() {
// TODO Auto-generated method stub
System.out.println("ModernRoad");
}
}
public class ModernBuilding extends Building{
@Override
public void build() {
// TODO Auto-generated method stub
System.out.println("ModernBuilding");
}
}
public class ModernTunnel extends Tunnel{
@Override
public void tunnel() {
// TODO Auto-generated method stub
System.out.println("ModernTunnel");
}
}
public class ModernJungle extends Jungle{
@Override
public void jungle() {
// TODO Auto-generated method stub
System.out.println("ModernJungle");
}
}
public class ModernMehodFatory extends MethodFactory{
@Override
public Road creatRoad() {
// TODO Auto-generated method stub
return new ModernRoad();
}
@Override
public Building creatBuilding() {
// TODO Auto-generated method stub
return new ModernBuilding();
}
@Override
public Tunnel creatTunnel() {
// TODO Auto-generated method stub
return new ModernTunnel();
}
@Override
public Jungle creatJungle() {
// TODO Auto-generated method stub
return new ModernJungle();
}
}
使用场景:
1、QQ换肤
2、数据库访问程序设计,不同的数据库访问方式可能不一样。
拓展连接:http://liuling123.com/2013/02/design-partten-factory.html