本實例需要根據植物園的種類確定植物園的布局, 而植物園的種類有很多,對應的植物園布局也各不相同。在這里假設有3種植物園:蔬菜園,一年生植物園,多年生植物園。這3種garden中種植的植物各不相同,體現在程序中即返回不同的關于“植物園布局”的對象。生成植物園的布局是我們的目的,如果把蔬菜園、一年生植物園、多年生植物園看作是3個“產品族”,而某一時刻只需要其中一個產品族。由于每個產品族需要一個生產的工廠,所以生產這3個產品族需要3個工廠,分別是蔬菜園工廠(VegieGarden.java),一年生植物園工廠(AnnualGarden.java),多年生植物園工廠(PerennialGarden.java)。由于這3個工廠都是生產植物園的工廠,每個工廠生產的產品又基本相同(都生產“中心布局”、“邊沿布局”、“陰處布局”3個產品),所以可以抽象一個工廠類(Garden.java),這個工廠類也具備生產“中心布局”、“邊沿布局”和“陰處布局”3個產品的能力,而生產的方法由具體的工廠來實現。這樣,再通過一個總控程序(GardenMaker.java)(這個總控程序也可以放到抽象的工廠中)指定需要調用的具體工廠。
首先來創建Plant.java類,它只有一個name屬性
public class Plant {
String name;
public Plant(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
然后是Garden類,3個方法分別是得到中心處、邊沿處和陰暗處的植物
public abstract class Garden {
public abstract Plant getCenter();
public abstract Plant getBorder();
public abstract Plant getShade();
}
下面是3個工廠類
/**
* 一年生植物園工廠
* @author Heinvo Lee
*
*/
public class AnnualGarden extends Garden {
@Override
public Plant getCenter() {
// TODO Auto-generated method stub
return new Plant("Marigold");//萬壽菊
}
@Override
public Plant getBorder() {
// TODO Auto-generated method stub
return new Plant("Alyssum");//十字花科植物;庭薺
}
@Override
public Plant getShade() {
// TODO Auto-generated method stub
return new Plant("Coleus");//薄荷科植物
}
}
/**
* 常年生植物園工廠
* @author Heinvo Lee
*
*/
public class PerennialGarden extends Garden {
@Override
public Plant getCenter() {
// TODO Auto-generated method stub
return new Plant("Dicentrum");
}
@Override
public Plant getBorder() {
// TODO Auto-generated method stub
return new Plant("Sedum");//景天屬植物;八寶
}
@Override
public Plant getShade() {
// TODO Auto-generated method stub
return new Plant("Astilbe");//落新婦屬植物
}
}
/**
* 蔬菜園工廠
* @author Heinvo Lee
*
*/
public class VegieGarden extends Garden {
public Plant getCenter() {
return new Plant("Corn");
}
public Plant getBorder() {
return new Plant("Peas");
}
public Plant getShade() {
return new Plant("Broccoli");//花椰菜
}
}
接下來創建總控類GardenMaker
public class GardenMaker {
private Garden garden;
public Garden getGarden(String gtype)
{
garden = new VegieGarden(); //default
if(gtype.equals("Perennial"))
garden = new PerennialGarden();
if(gtype.equals("Annual"))
garden = new AnnualGarden();
return garden;
}
}
然后是一個測試類了
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
GardenMaker gm=new GardenMaker();
Garden vg=gm.getGarden("Vegie");
Garden ag=gm.getGarden("Annual");
Garden pg=gm.getGarden("Perennial");
System.out.println("Vegie garden, center: "+vg.getCenter().getName());
System.out.println("Vegie garden, border: "+vg.getBorder().getName());
System.out.println("Vegie garden, shade: "+vg.getShade().getName());
System.out.println("------------------------------------");
System.out.println("Annual garden, center: "+ag.getCenter().getName());
System.out.println("Annual garden, border: "+ag.getBorder().getName());
System.out.println("Annual garden, shade: "+ag.getShade().getName());
System.out.println("------------------------------------");
System.out.println("Perennial garden, center: "+pg.getCenter().getName());
System.out.println("Perennial garden, border: "+pg.getBorder().getName());
System.out.println("Perennial garden, shade: "+pg.getShade().getName());
// TODO Auto-generated method stub
}
}
執行這個測試類,可以在控制臺看到以下效果(我以紅色標紅)
Vegie garden, center: Corn
Vegie garden, border: Peas
Vegie garden, shade: Broccoli
------------------------------------
Annual garden, center: Marigold
Annual garden, border: Alyssum
Annual garden, shade: Coleus
------------------------------------
Perennial garden, center: Dicentrum
Perennial garden, border: Sedum
Perennial garden, shade: Astilbe
從這個例子我看出以下:
GardenMaker gm=new GardenMaker();
Garden vg=gm.getGarden("Vegie");
Garden ag=gm.getGarden("Annual");
Garden pg=gm.getGarden("Perennial");
上面4句代碼是測試類里面的
當需要生產某一種植物園的布局時,只需要將植物園的類型告訴總控程序(GardenMaker.java),這里是傳入參數Vegie、Annual、Perennial,總控程序決定使用生產指定類型植物園的工廠生產出需要的“產品族”,而在此過程中,不需要了解具體工廠中的方法是如何實現的。
posted on 2009-10-14 14:45
老丁 閱讀(351)
評論(0) 編輯 收藏 所屬分類:
設計模式