import java.util.HashMap;
import java.util.Map;interface IPlayer {
public void run();
}class Player1 implements IPlayer {
public void run() {
System.out.println("AAA run()");
}
}class Player2 implements IPlayer {
public void run() {
System.out.println("BBB run()");
}
}class AiFactory {
private final static Map<Integer, IPlayer> ais = new HashMap<Integer, IPlayer>(2); public static IPlayer getInstance(int level) {
IPlayer ai = ais.get(level);
if (null == ai) {
switch (level) {
case 1:
ais.put(level, new Player1());
break;
case 2:
ais.put(level, new Player2());
break;
}
}
return ais.get(level);
}
}public class factory {
private static final IPlayer player11 = AiFactory.getInstance(1);
private static final IPlayer player22 = AiFactory.getInstance(2);
private static final IPlayer player33 = AiFactory.getInstance(1);
private static final IPlayer player44 = AiFactory.getInstance(1);

    public static void main(String args[]) {
     Player1 player1 = new Player1(); 
     Player2 player2 = new Player2();
     player1.run();
     player2.run();
     player11.run();
     player22.run();
     player33.run();
     player44.run();
    }
}

解决方案 »

  1.   

    就你上面的代码,没什么区别。谈不上哪个更好。如果你用工厂模式的话.Factory的优势就显而易见了
      

  2.   

    不涉及到IoC的话,体现不出什么好处
      

  3.   

    譬如你在一个工程的很多类里写了以下声明Map map = new HashMap();假设有10000次现在,你的主管告诉你,把HashMap统统换成ConcurrentHashMap,即Map map = new ConcurrentHashMap();那么,接下来就去搜索,改10000次吧
    如果我是这么写的Map map = Factory.getMap();那么我只需改getMap中的实现即可,仅此一处,不会遗漏当然这个例子有点牵强,但意思基本表达到了
      

  4.   

    那要看在什么场合用了。。ticmy说的是一种用途,工厂生产具有统一性,工厂可以生产一类事物,如果发生变动,改工厂方法就行第二种就是坦克大哥说的:Ioc   就是说你用的时候,直接去里面取,用完以后又放回去。这样可以减少new 对象的开支如果只是普通的小应用,这两者区别不大
      

  5.   

    这与产生对象的入口有关。用工厂方法的话,产生对象的入口只有一处,不像 new 可以在任意地方使用。
      

  6.   


    个人体会,工程里能不new 尽量不让new 。 因为随便new出去的对象,对于框架来说基本是不可控的。你不无法知道具体编码人员最后都怎么处理的。
      

  7.   

    Q q = new Q()Q q = Factory.newQ();Q newQ(){
       // 这是多出来的方法,
       // 你可以在这里干任何事件
       // 把神马强奸了都可以
       // 就是这作用
    }
      

  8.   

    看看spring的IOC部分,应该会清楚很多的.
      

  9.   

    effective java的第一条说的很清楚,我摘要如下:
    (1)工厂方法有名称;
    (2)工厂方法不必每次调用对象的时候都去创造一个新的对象;
    (3)工厂方法可以返回原返回类型的任何子类型对象
    (4)工厂方法在创建参数化类型的实例的时候,他们使得代码更简洁;
      

  10.   

    没有绝对的好与不好。如果就楼主的这个程序看,其实用不用工厂,逻辑是有区别的,如果用工厂,就保证了Player1,Player2都各只有一个实例。
      

  11.   

    我不觉得Factory出来和new出来有什么区别,都是new出来的,只是把new写在硬编码里还是写在Factory里而已。这个区别不是一个定义能下出来的,模式也不是一定最好的,也有它适用的场景,遵守OO原则,活学活用,无招胜有招,才是王道。
      

  12.   

    我接受Factory,它毕竟没什么副作用的,而有正面意义。