laoding
本来我以为,隐身了别人就找不到我,没有用的,像我这样拉风的男人,无论走到哪里,都像在黑暗中的萤火虫一样,那样的鲜明,那样的出众。我那忧郁的眼神,稀疏的胡茬,那微微隆起的将军肚和亲切的笑容......都深深吸引了众人......
posts - 0,  comments - 37,  trackbacks - 0

本实例需要根据植物园的种类确定植物园的布局, 而植物园的种类有很多,对应的植物园布局也各不相同。在这里假设有3种植物园:蔬菜园,一年生植物园,多年生植物园。这3garden中种植的植物各不相同,体现在程序中即返回不同的关于“植物园布局”的对象。生成植物园的布局是我们的目的,如果把蔬菜园、一年生植物园、多年生植物园看作是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 老丁 阅读(329) 评论(0)  编辑  收藏 所属分类: 设计模式

只有注册用户登录后才能发表评论。


网站导航:
 
本博客主为学习和复习之用,无关其他,想骂人的绕道
Email:dkm123456@126.com
大家一起交流进步
QQ:283582761


<2024年3月>
252627282912
3456789
10111213141516
17181920212223
24252627282930
31123456

留言簿(4)

我参与的团队

文章分类(50)

文章档案(48)

相册

朋友

搜索

  •  

积分与排名

  • 积分 - 95272
  • 排名 - 600

最新评论