设计模式之不简单的工厂模式(一)

谈起设计模式中两个最简单的设计模式第一个大家想到的应该就是单例模式,第二个想必就是工厂模式了,拿我自身而言之前一直以来对工厂方法认识较浅,只觉得所谓的工厂模式就是将创建对象的过程封装到一个工厂类里面,需要调用的时候传入参数然后返回指定的对象,好的,下面步入正题;

说起工厂模式,要明确一个作用,就是用来创建对象的,将创建对象的方式从最基本的new语句解放出来,一般来说有三块知识点:

1、简单工厂

2、工厂方法模式

3、抽象工厂模式

本篇文章就先介绍简单工厂,关于简单工厂,很多人把它也称为设计模式,其实它并不是一种设计模式,或者说称为一种编程习惯更好一些,采用它的好处就是你在调用的时候不需要去关心对象是如何实现的,对于客户而言,只需要做到传递参数,然后获取对象;举个JDBC的例子,由于不同的数据库提供商对java.sql.Driver提供了不同的实现,导致了实现类和URL各不相同,那么我们在获取数据库连接的时候,就会使用如下不同的代码:


试想一下,如果一个Java项目在在一个应用中需要频繁的跟不同的数据库打交道,也就是说需要根据不同状况获取不同的JDBC的Connection对象,如下所示:

	public void doSaveUserInfo(UserInfo userInfo){
		
		Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
		String url="jdbc:oracle:thin:@localhost:1521:orcl"//orcl为数据库的SID(实例名)
		String user="system";//用户名
		String pwd="admin";//密码
		Connection conn=DriverManager.getConnection(url,user,pwd);
		
		// 保存用户信息
		....
	}
	
	public void doSaveUserInfo(UserInfo userInfo){
		Class.forName("com.mysql.jdbc.Driver").newInstance();
		String url="dbc:mysql://localhost:3306/mydb";//dbName为数据库名
		String user="system";//用户名
		String pwd="admin";//密码
		java.sql.Connection conn=DriverManager.getConnection(url,user,pwd);
		
		// 保存用户信息
		....
	}
上述赘余连接数据库的代码肯定会大量出现,既然这样为何不将创建数据库连接的具体信息封装到一个对象里面去,用户调用的时候不用关心Connection对象如何创建,只需要传递一个信号告诉这个对象,我需要XXX数据库,你给我建立连接,就可以了,简单实例如下所示:

package com.utils;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBUtils {
	
	public static Connection getConnFor(String dbType) throws Exception{
		
		if("oracle".equals(dbType)){
			Class.forName("oracle.jdbc.driver.OracleDriver");
			String url="jdbc:oracle:thin:@localhost:1521:orcl";
			return DriverManager.getConnection(url, "***", "***");
		}else if("mysql".equals(dbType)){
			Class.forName("com.mysql.jdbc.Driver");
			String url="dbc:mysql://localhost:3306/mydb";//dbName为数据库名
			return DriverManager.getConnection(url,"***", "***");
		}else if("DB2".equals(dbType)){
			Class.forName("com.ibm.db2.jcc.DB2Driver");
			String url="jdbc:db2://127.0.0.1:50000/dbname";//dbName为数据库名
			return DriverManager.getConnection(url,"***", "***");
		}else{
			System.out.println("暂不支持其它数据库类型");
			return null;
		}
	}
	
}
这样已来,任何想要使用数据库连接的地方只需要通过以下方式:

	// 获取Oracle连接
	Connection oracleConn = DBUtils.getConnFor("oracle");

	// 获取MySql连接
	Connection mysqlConn = DBUtils.getConnFor("mysql");

	// 获取DB2连接
	Connection db2Conn = DBUtils.getConnFor("DB2");
像DBUtils这个类,就叫做工厂类,该类封装了创建具体对象的细节,使得客户只需要告诉它一个信号,该工厂类根据传递过阿里的信号创建对应的对象实例并返回,好了简单工厂就说这么多,下篇要开始重点介绍工厂方法模式和抽象工厂模式;


猜你喜欢

转载自blog.csdn.net/yu102655/article/details/52562569