工場と匿名の内部クラス
2985 ワード
// &
interface Service{
void method1();
void method2();
}
interface ServiceFactory{
Service getService();
}
class Implementation1 implements Service{
private Implementation1(){}
public void method1(){
System.out.println("Implementation1 methdo1");
}
public void method2(){
System.out.println("Implementation1 methdo2");
}
public static ServiceFactory factory = new ServiceFactory(){
public Service getService() {
return new Implementation1();
}
};
}
class Implementation2 implements Service{
private Implementation2(){};
public void method1() {
System.out.println("Implementation2 methdo1");
}
public void method2() {
System.out.println("Implementation2 methdo2");
}
public static ServiceFactory factory = new ServiceFactory(){
public Service getService(){
return new Implementation2();
}
};
}
public class Factories {
public static void serviceConsumer(ServiceFactory fact){
Service s =fact.getService();
s.method1();
s.method2();
}
public static void main(String[] args){
serviceConsumer(Implementation1.factory);
serviceConsumer(Implementation2.factory);
}
}
このように、1つの工場が1つのサービスに対応します.具体例:
package InnerClass;
interface Game{
boolean move();
}
interface GameFactory{
Game getGame();
}
class Checkers implements Game{
private Checkers(){}
private int moves = 0;
private static final int MOVES = 3;
public boolean move(){
System.out.println("Checkers move "+moves);
return ++moves != MOVES;
}
public static GameFactory factory = new GameFactory(){
public Game getGame(){
return new Checkers();
}
};
}
class Chess implements Game{
private Chess(){}
private int moves = 0;
private static final int MOVES = 4;
public boolean move(){
System.out.println("Chess move "+moves);
return ++moves != MOVES;
}
public static GameFactory factory = new 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(Checkers.factory);
playGame(Chess.factory);
}
}
PS:Thinking in Javaより抜粋