posts - 0,  comments - 3,  trackbacks - 0

 简单工厂模式的 代码示例:本例实现了一个 水果工厂,有一个果农负责生产客户需要的水果。 客户只需要告诉果农:我要苹果或者草莓等,果农就可以提供相应的产品给客户。下面是简单工厂模式完全应用的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设计模式
<2025年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿(1)

文章分类

文章档案

搜索

  •  

最新评论