Java设计模式之工厂模式
Posted hello策
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式之工厂模式相关的知识,希望对你有一定的参考价值。
工厂设计模式,我们在工厂对象上调用的是创建方法,而该工厂对象将生成接口的某种实现的对象。理论上,通过这种方式,我们的代码完全与接口的实现分离,这使得我们透明的将某个实现替换为另一个实现。
比如利用工厂方法来执行抛硬币(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编程思想》
以上是关于Java设计模式之工厂模式的主要内容,如果未能解决你的问题,请参考以下文章