Thinking in Java
第四版練習18 創建一個Cycle接口,及其Unicycle、Bicycle、Tricycle實現。對每種類型的Cycle都創建工廠,然後編寫代碼使用這些工廠。
package interfaces;
interface Cycle{
int wheels();
}
interface CycleFactory{
Cycle getCycle();
}
class Unicycle implements Cycle{
public int wheels(){
return 1;
}
}
class UnicycleFactory implements CycleFactory{
public Cycle getCycle(){
return new Unicycle();
}
}
class Tricycle implements Cycle{
public int wheels(){
return 3;
}
}
class TricycleFactory implements CycleFactory{
public Cycle getCycle(){
return new Tricycle();
}
}
class Bicycle implements Cycle{
public int wheels(){
return 2;
}
}
class BicycleFactory implements CycleFactory{
public Cycle getCycle(){
return new Bicycle();
}
}
public class E18_CycleFactory {
public static void CycleWheels(CycleFactory factory){
Cycle cycle=factory.getCycle();
System.out.println(cycle.wheels());
}
public static void main(String[] args){
CycleWheels(new TricycleFactory());
CycleWheels(new BicycleFactory());
CycleWheels(new UnicycleFactory());
}
}
練習19,使用工廠方法創建一個框架,可以執行拋硬幣和擲骰子的功能。
package interfaces;
interface Tossing{
boolean result();
}
interface TossingFactory{
Tossing getTossing();
}
class CoinTossing implements Tossing{
private int events;
private static final int EVENTS=2;
public boolean result(){
System.out.println(events);
return ++events!=EVENTS;
}
}
class CoinTossingFactory implements TossingFactory{
public Tossing getTossing(){
return new CoinTossing();
}
}
class DiceTossing implements Tossing{
private int events;
private static final int EVENTS=6;
public boolean result(){
System.out.println(events);
return ++events!=EVENTS;
}
}
class DiceTossingFactory implements TossingFactory{
public Tossing getTossing(){
return new DiceTossing();
}
}
public class E19_TossingFactory {
public static void simulate(TossingFactory factory){
Tossing t=factory.getTossing();
while(t.result()){
;
}
}
public static void main(String[] args){
simulate(new CoinTossingFactory());
simulate(new DiceTossingFactory());
}
}
接口是實現多重繼承的途徑,而生成遵循某個接口的對象的典型方式是工廠方法設計模式。
通過工廠方式,代碼將完全與接口的實現分離,這樣就可以透明的將某個實現替換爲另一種實現。