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类图。但何必呢?简单工厂模式不是总结得挺好的吗?
另外,加上一层,也是为了在层次上更清晰,更能体现针对接口编程的好处和体现重载的价值。