工厂设计模式,我们在工厂对象上调用的是创建方法,而该工厂对象将生成接口的某种实现的对象。理论上,通过这种方式,我们的代码完全与接口的实现分离,这使得我们透明的将某个实现替换为另一个实现。

  比如利用工厂方法来执行抛硬币(Coin)和投骰子(Dice类)的功能。以下用2个方式来实现工厂模式。

第一种:

  // Game的接口  

  public interface Game {
    int play();
  }

  // Game工厂的接口:创建对象

  public interface GameFactory(){

    Game getGame();

  }

  // 硬币的实现类

  public class Coin implements Game{

    /**

    *该方法生产一个1~2的随机数

    */

    public int play() {

      System.out.println("Coin play()");
      Random r = new Random();
      return r.nextInt(2);
     }
  }

  // 硬币的工厂对象产生类:生成一个Coin对象

  public class CoinFactory implements GameFactory{

  public Game getGame() {
    return new Coin();
  }

  }

  // 骰子的实现类

  public class Dice implements Game{

    /**

    *该方法生产一个1~6的随机数

    */

    public int play() {

      System.out.println("Dice play()");
      Random r = new Random();
      return r.nextInt(6);
     }
  }

  // 骰子的工厂对象产生类:生成一个Dice对象

  public class DiceFactory implements GameFactory{

  public Game getGame() {
    return new Dice();
  }

  }

  

  // 测试工厂类

  public class TestFactory {


  public static int game(GameFactory gamefactory){
    Game game = gamefactory.getGame();
      return game.play();
    }

    public static void main(String[] args){

      //创建coin对象并调用play方法
      CoinFactory coin = new CoinFactory();
      System.out.println(game(coin));

      //创建Dice对象

      System.out.println(game(new DiceFactory()));
    }

  }

 

  以上是简单的工厂模式,下面这个例子使用匿名内部内来实现工厂模式。

第二种:

  // Game的接口  

  public interface Game {
    int play();
  }

  // Game工厂的接口:创建对象

  public interface GameFactory(){

    Game getGame();

  }

  // 硬币的实现类

  public class Coin implements Game{

    private Coin(){}

 

    public int play(){

      System.out.println("Coin play()");

      return (int)(Math.random()*2)+1;

    }

 

    public static GameFactory factory = new GameFactory(){

       public Game getGame(){

         return new Coin(); 

       } 

    };

  }

 

  // 骰子的实现类

  public class Dice implements Game{

    private Dice(){}

 

    public int play(){

      System.out.println("Dice play()");

      return (int)(Math.random()*6)+1;

    }

 

    public static GameFactory factory = new GameFactory(){

       public Game getGame(){

         return new Dice(); 

       } 

    };

  }

 

  //测试类

  public class TestFactory {

    public TestFactory() {}


    public static void games(GameFactory fact){
      Game g = fact.getGame();
      g.play();
    }

    public static void main(String[] args){
      GameFactory coin = Coin.factory;
      games(coin);
      games(Dice.fact);  
    }

  }

 

在该例中,Coin和Dice的构造器都可以是private的,并且没有任何必要去创建作为工厂的具名类。另外,你经常只需要单一的工厂对象,在本例中它被创建Game实现中的一个static域。

参考:《Java编程思想》

  

 

  

 

  

posted on 2017-04-22 13:41  hello策  阅读(173)  评论(0编辑  收藏  举报