简单工厂模式的 代码示例:本例实现了一个 水果工厂,有一个果农负责生产客户需要的水果。 客户只需要告诉果农:我要苹果或者草莓等,果农就可以提供相应的产品给客户。下面是简单工厂模式完全应用的UML

接口Fruits的代码如下:
public interface Fruits {
public void grow();
public void harvest();
public void plant();
}
类Apple的源代码
public class Apple implements Fruits {
/*
* 苹果的特有属性。苹果数的树龄
*/
private int treeage;
public int getTreeage() {
return treeage;
}
public void setTreeage(int treeage) {
this.treeage = treeage;
}
public void grow() {
System.out.println("苹果的生长方法");
}
public void harvest() {
System.out.println("苹果的收获方法");
}
public void plant() {
System.out.println("苹果的种植方法");
}
}
类Grape的源代码
public class Grape implements Fruits {
/*
* 葡萄的特有属性:有籽和无籽
*/
private boolean seedless;
public boolean isSeedless() {
return seedless;
}
public void setSeedless(boolean seedless) {
this.seedless = seedless;
}
public void grow() {
System.out.println("葡萄的生长方法");
}
public void harvest() {
System.out.println("葡萄的收获方法");
}
public void plant() {
System.out.println("葡萄的种植方法");
}
}
StrawBerry的源代码
public class StrawBerry implements Fruits {
public void grow() {
System.out.println("草莓的生长方法");
}
public void harvest() {
System.out.println("草莓的收获方法");
}
public void plant() {
System.out.println("草莓的种植方法");
}
}
水果工厂的原代码
public class FruitsGrower {
public static Fruits fruitFactory(String fruitType) throws BadFruitException
{
if(fruitType.equalsIgnoreCase("grape"))
{
return new Grape();
}
else if(fruitType.equalsIgnoreCase("apple"))
{
return new Apple();
}
else if(fruitType.equalsIgnoreCase("strawberry"))
{
return new StrawBerry();
}
else
{
throw new BadFruitException("这个水果工厂不能生产类型为"+fruitType+"的水果");
}
}
}
如果请求的类型错误,抛出BadFruitException异常
public class BadFruitException extends Exception {
/**
*
*/
private static final long serialVersionUID = 4036317488144249503L;
public BadFruitException(String msg) {
super(msg);
}
}
工厂方法的使用
public static void main(String args[])
{
try {
FruitsGrower.fruitFactory("grape");
} catch (BadFruitException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
====================================================================
以上代码演示了一个完整的简单工厂模式(SimpleFactory),在实际应用中,可以省略产品的抽象,即Fruits接口,直接产生产品;也可以将工厂与抽象产品合并,即抽象产品也是也是生产子类的工厂;也可以将3个角色全部合并。
1。简单工厂模式的优点:
模式的核心是工厂类,这个类含有必要的判断逻辑,可以决定在什么时候创建哪个产品的实例。而客户端可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。实现了责任分隔。
2。缺点:
上面的例子中,果农类无疑是整个模式的核心类,当他不能工作了,整个工厂就随之瘫痪。
可扩展性:当需要添加新的产品时,就必须更改果农类的代码,增加必要的 判断逻辑。
由于果农类使用了静态方法为工厂方法,而静态方法无法由子类继承,因此工厂角色无法形成基于继承的等级结构。
================================================================
简单工厂模式作为一个最基本的设计模式,在JDK的API中得到了很好的应用。、
DateFormat 类:
一个日期和时间的格式化类, 查看代码可以发现:DateFormat类是一个抽象类,但DateFormat.getDateInstance()为什么又会得到一个实例呢?原来DateFormat.getDateInstance()并没有调用DateFormat()来构造自己的实例,而是使用了静态方法,经过逻辑判断生成了SimpleDateFormat实例。SimpleDateFormat则是DateFormat的一个子类。
下面是DateFormat的示意图:

posted on 2007-07-01 10:17
李桢 阅读(218)
评论(0) 编辑 收藏 所属分类:
java设计模式