当前位置: 代码迷 >> Java相关 >> 鄙人愚鲁,看不懂工厂方法的意义,哪位给解释一下
  详细解决方案

鄙人愚鲁,看不懂工厂方法的意义,哪位给解释一下

热度:4936   发布时间:2013-02-25 21:50:48.0
在下愚鲁,看不懂工厂方法的意义,哪位给解释一下?
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 0Checkers move 1Checkers move 2Chess move 0Chess move 1Chess move 2Chess 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 0Checkers move 1Checkers move 2Chess move 0Chess move 1Chess move 2Chess move 3*///:~

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

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

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

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

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

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

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



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


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