日期:2014-05-20  浏览次数:20713 次

在下愚鲁,看不懂工厂方法的意义,哪位给解释一下?
java编程思想上一个关于游戏的例子来说明工厂方法的意义:在相同的棋盘上下国际象棋和西洋跳棋,但我实在没看出有何意义:
Java code

// A Game framework using Factory Methods.
import static net.mindview.util.Print.*;

interface Game { boolean move(); }
interface GameFactory { Game getGame(); }

class Checkers implements Game {
  private int moves = 0;
  private static final int MOVES = 3;
  public boolean move() {
    print("Checkers move " + moves);
    return ++moves != MOVES;
  }
}

class CheckersFactory implements GameFactory {
  public Game getGame() { return new Checkers(); }
}    

class Chess implements Game {
  private int moves = 0;
  private static final int MOVES = 4;
  public boolean move() {
    print("Chess move " + moves);
    return ++moves != MOVES;
  }
}

class ChessFactory implements GameFactory {
  public Game getGame() { return new Chess(); }
}    

public class Games {
  public static void playGame(GameFactory factory) {
    Game s = factory.getGame();
    while(s.move())
      ;
  }
  public static void main(String[] args) {
    playGame(new CheckersFactory());
    playGame(new ChessFactory());
  }
} /* Output:
Checkers move 0
Checkers move 1
Checkers move 2
Chess move 0
Chess move 1
Chess move 2
Chess move 3
*///:~


多加了一层,尽管没有显式地用new创建对象,但通过指定不同的工厂也间接地指定了对象,有何意义呢?改为下面的也可以:
Java code

public class Games {
  public static void playGame(Game factory) {
    Game s = factory;
    while(s.move())
      ;
  }
  public static void main(String[] args) {
    playGame(new Checkers());
    playGame(new Chess());
  }
} /* Output:
Checkers move 0
Checkers move 1
Checkers move 2
Chess move 0
Chess move 1
Chess move 2
Chess move 3
*///:~


playGame(new CheckersFactory())这一句其实也指定了要创建的对象的,与直接指定有何区别呢?

------解决方案--------------------
工厂方法用于解除创建对象创建的具体细节之间的耦合。
换句话说就是,将变化的创建细节不变的创建需求实现分离。
我喜欢把工厂模式与适配器模式一起使用,单独的工厂不怎么用。
------解决方案--------------------
工厂模式: 提供一个创建对象的接口.

可以分为:简单工厂, 工厂方法, 抽象工厂.

简单工厂,就是通过 构造器 new 出一个对象. 比如:new User(), new User("hairui")......

工厂方法,就是提供一个方法来创建对象, 根据不同的外部请求创建不同的对象给你,但被创建的对象实现的都是一个接口.
这就是工厂模式的价值,不管有多少个对象都可以通过一个接口创建,也就是说被创建的对象必须实现这个接口.

抽象工厂,工厂中创建对象的方法是抽象的,因为不能确定方法中的逻辑,延迟到子类中去实现.
但并不影响外部程序通过一个一致的接口对它的请求.

引深总结:使用工厂模式的场景的必要因素是创建2个接口,一个是Factory的接口,一个是 Product的接口.



------解决方案--------------------
你先看看模板方法,工厂方法是模板方法应用于类层面的设计。
工厂方法里面就是将生产流程给抽象出来了,
例如生产芯片的工厂是类,intel和amd就是对象,他们的生产流程总体是一样的
------解决方案--------------------
这是一个简单工厂的例子。对于这种例子,个人觉得是为了保持和抽象工厂以及工厂方法在模式上的一致,在实际操作中,与简单工厂具有相同功能的优雅代码还是大有的在。并不是说简单工厂模式告诉你,当你遇到要把对象的使用和创建对象的过程分离是,你就得使用简单工厂模式,你可以用其他的方法去实现。但问题是,你在交流时就会有问题。现在大家都知道简单工厂是怎么回事,你现在怎样概括你这个模式呢?显然你没有一个合适的名称。这就会导致交流上的问题:你可能给他绘一张UML类图。但何必呢?简单工厂模式不是总结得挺好的吗?


另外,加上一层,也是为了在层次上更清晰,更能体现针对接口编程的好处和体现重载的价值。