设计模式第一篇 
杨恒贤([email protected]) 
  
简介: 
       本文介绍了一种经常用的设计模式------工厂模式. 并且通过Eclipse里面的UML介绍怎么设计类工厂. 
(关于设计模式中的主要设计模式,我会一一介绍在Java(工具Eclipse)里面的使用,全部原创.) 
  
现在的COM,COM+广泛使用了设计模式中的工厂模式 ,当你深入学习Java后会发现其实在Java使用工厂模式会使程序更容易调试. 
下面我们来具体介绍一下怎么使用工厂模式来简化自己的开发. 
1.       什么是工厂模式 
简单的说工厂模式就是相当于Java中的new的功能. 他按实际生活中的现象来构架的. 一个商品一定是在一个工厂里面产生的. 应用于编程中就变成了,一个对象必须是由一个对象工厂产生的. 
典型的UML如下: 
  
  
2.       为什么工厂模式是如此常用 
因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。 
工厂模式 
  
3.       基本构架 
程序框架如下: 
一般工厂模式的是利用工厂类静态函数来产生操作实现的接口对象 所以说工厂类有一个静态函数,被产生的对象有一个接口. 
典型类图: 
 
 
  
  
4.       使用范围 
当遇到下面的情况时,开发人员可以考虑采用工厂模式:  
1.       在编码时不能预见需要创建哪一种类的实例。  
2.       一个类使用它的子类来创建对象。  
3.       开发人员不希望创建了哪个类的实例以及如何创建实例的信息暴露给外部程序。 
4.       基类可以是一个抽象类,在这种情况下,工厂类必须返回一个非抽象类。  
5.       基类提供了一些缺省方法,只有当这些缺省方法不能满足特殊需求的情况下才在子类中重写这些方法。  
6.       可以直接通过传递给工厂类的参数决定应该返回哪一个子类的实例。 
  
  
  
下面我们结合Eclipse中的UML工具来展示使用过程. 
  
我们以数据库操作类的设计为例: 
现在一个Eclipse可以使用的UML Plug-in. 典型的由EclipseUML , TogetherEC . 
  
数据库操作功能要求: 
1.       适应不同的数据库 
2.       适应相同数据库的不同连接 
3.       处理与数据库相关的异常 
  
我们用工厂类 
首先,设计数据库操作的功能函数 
package com.jp.nissan.dealer.practice.db; 
  
import java.sql.*; 
import java.util.List; 
  
public interface IBaseDatabase { 
  /** 
   * 不支持存储过程的操作 
   */ 
   Connection getConnection() throws Exception; 
   void disConnect(); 
   void runSQL(String strSQL)throws SQLException; 
   void runSQL(String strSQL,List values) throws SQLException; 
   ResultSet openSQL(String strSQL) throws SQLException; 
   ResultSet openSQL(String strSQL,List values)throws SQLException; 
  } 
为了支持不同数据库,我们定制一个工厂类: 
package com.jp.nissan.dealer.practice.db; 
  
import javax.naming.NamingException; 
  
import java.sql.SQLException; 
  
public class DBFactory { 
  public static IBaseDatabase createDB(){ 
    try { 
      IBaseDatabase db = new TestDB2Database(); 
      return db; 
    } 
    catch (NamingException ex) { 
      return null; 
    } 
    catch (SQLException ex) { 
      return null; 
    } 
    catch(Exception e){ 
      return null; 
    } 
  
  } 
} 
开始在UML图上设计 
  
然后让UML工具产生代码,你会发现很多框架性代码已经成功产生. 
  
开始编写你的具体数据库操作. 使用Java类的继承性,这样既达到低的耦合型,又达到高的重用型. 
  
最后: 
 关于数据库实现代码,可以发信跟我要. 
谢谢.                                                    2004-2-18  
 
  |