Java语言设计模式之抽象工厂(Abstract factories)模式

来源:互联网 发布:dns中顶级域名有哪些 编辑:程序博客网 时间:2024/06/07 08:22

抽象工厂(Abstract factories)
基本思想是:在创建工厂对象的地方,由你来决定如何使用该工厂对象创建的那些对象。

假设你要创建一个通用的游戏环境,而且你还想要支持不同类型的游戏。下面的例子用抽象工厂给出了它的一种可能的实现。
Games.java

package com.enfo.wd.factory;interface Obstacle{    void action();}interface Player{    void interactWith(Obstacle o);}class Kitty implements Player{    @Override    public void interactWith(Obstacle o) {        System.out.println("Kitty has encountered a");        o.action();    }}class KungFuGuy implements Player{    @Override    public void interactWith(Obstacle o) {        System.out.println("KungFuGuy now battles a");        o.action();    }}class Puzzle implements Obstacle{    @Override    public void action() {        System.out.println("Puzzle");    }}class NastyWeapon implements Obstacle{    @Override    public void action() {        System.out.println("NastyWeapon");    }}interface GameElementFactory{    Player makePlayer();    Obstacle makeObstacle();}class KittiesAndPuzzles implements GameElementFactory{    @Override    public Player makePlayer() {        return new Kitty();    }    @Override    public Obstacle makeObstacle() {        return new Puzzle();    }}class KillAndDismember implements GameElementFactory{    @Override    public Player makePlayer() {        return new KungFuGuy();    }    @Override    public Obstacle makeObstacle() {        return new NastyWeapon();    }}class GameEnvironment{    @SuppressWarnings("unused")    private GameElementFactory gef;    private Player p;    private Obstacle ob;    public GameEnvironment(GameElementFactory factory){        gef=factory;        p=factory.makePlayer();        ob=factory.makeObstacle();    }    public void play(){p.interactWith(ob);}}public class Games {    GameElementFactory kp=new KittiesAndPuzzles(),kd=new KillAndDismember();    GameEnvironment g1=new GameEnvironment(kp) ,            g2=new GameEnvironment(kd);    public void test1(){g1.play();}    public void test2(){g2.play();}    public static void main(String[] agrs){        Games games=new Games();        games.test1();        games.test2();    }}

在上面的游戏环境里,Player 对象与 Obstale 对象交互,根据你所选择的游戏类型,player 和 obstacle 的各自类型也会不同。你通过选择某个特定的GameElementFactory 来决定游戏的类型,然后 GameElementFactory 会控制初始化和游戏的进行。在上面的例子里,初始化和游戏的进行都非常简单,但那些活动(初始条件和状态变化)可以在很大程度上决定游戏的结局。这里,GameEnvironment 不是用来给其它类继承的 ,尽管那么做很可能也说的通。

阅读全文
0 0
原创粉丝点击