定義
將創(chuàng)建對象的動作統(tǒng)一管理,根據(jù)不同的需求提供給使用者不同的對象
比如說在數(shù)據(jù)庫的連接中,有多種不同的數(shù)據(jù)產(chǎn)品,java在連接每種產(chǎn)品時的所要求的步驟都是不一樣的, 那么程序員在開發(fā)的時候就需要非常熟悉每種產(chǎn)品的連接步驟. 同時,每種產(chǎn)品的連接步驟有些是相同的, 如果我們將這些產(chǎn)品的連接步驟寫到一個類中去,形成一個工廠類,那么我們在創(chuàng)建連接的時候就可以直接調(diào)用工廠類獲取連接對象就可以了. 程序員從原來的需要記住所有產(chǎn)品的連接步驟,到只需要告訴工廠需要獲取哪個產(chǎn)品的連接對象就可以了
前提條件
要有繼承,實現(xiàn)
優(yōu)缺點
優(yōu)點
極大的方便了使用者
一個調(diào)用者想創(chuàng)建一個對象,只要知道其名稱就可以了
擴展性高,如果想增加一個產(chǎn)品,只要擴展一個操作類就可以
屏蔽產(chǎn)品的具體實現(xiàn),調(diào)用者只關心產(chǎn)品的接口
缺點
工廠會同時持有多個類,隨著條件的增多, 工廠持有的類也會增加,一定程度上增加了系統(tǒng)的復雜度
一旦添加新的產(chǎn)品,就必須要對工廠的代碼進行修改, 當產(chǎn)品較多時, 就有可能造成工廠的復雜度過高,不利于維護
案例演示
獲取數(shù)據(jù)庫的連接對象,每個連接對象都有 發(fā)送指令, 關閉連接的方法
現(xiàn)有三個數(shù)據(jù)庫 mysql oracle sqlserver
mysql的連接步驟: 校驗用戶名密碼 發(fā)送測試信息 創(chuàng)建連接對象
oracle的連接步驟: 校驗用戶名密碼 測試數(shù)據(jù)傳輸?shù)男?創(chuàng)建連接對象
sqlserver的連接步驟:校驗用戶名密碼 發(fā)送測試信息 測試數(shù)據(jù)傳輸效率 創(chuàng)建連接對象
//數(shù)據(jù)庫接口
public interface DB {
//發(fā)送信息方法
public void sendMessage();
//關系數(shù)據(jù)庫連接方法
public void close();
}
//Mysql數(shù)據(jù)庫
public class MySql implements DB{
public MySql(){
System.out.println("mysql連接初始化...");
System.out.println("執(zhí)行mysql的連接規(guī)則");
}
@Override
public void sendMessage() {
System.out.println("mysql發(fā)送數(shù)據(jù)成功");
}
@Override
public void close() {
System.out.println("mysql連接關閉");
}
}
//Oracle數(shù)據(jù)庫
public class Oracle implements DB{
public Oracle(){
System.out.println("oracle連接初始化...");
System.out.println("執(zhí)行oracle的連接規(guī)則");
}
@Override
public void sendMessage() {
System.out.println("oracle發(fā)送數(shù)據(jù)成功");
}
@Override
public void close() {
System.out.println("oracle連接關閉");
}
}
//SqlServer數(shù)據(jù)庫
public class SqlServer implements DB{
public SqlServer(){
System.out.println("sqlserver連接初始化...");
System.out.println("執(zhí)行sqlserver的連接規(guī)則");
}
@Override
public void sendMessage() {
System.out.println("sqlserver發(fā)送數(shù)據(jù)成功");
}
@Override
public void close() {
System.out.println("sqlserver連接關閉");
}
}
//工廠類
public class ConnectFactory {
private String userName;
private String password;
private String dbName;
//初始化工廠類對象的時候,需要獲取用戶名密碼和數(shù)據(jù)庫名稱,以便于校驗和選擇數(shù)據(jù)連接
public ConnectFactory(String userName, String password, String dbName) {
super();
this.userName = userName;
this.password = password;
this.dbName = dbName;
}
public DB getConnection(){
boolean flg = checkMessage(); //校驗用戶名密碼
if(flg){
switch (dbName) {
case "mysql": // 如果是myql的話 執(zhí)行mql的連接步驟
System.out.println("發(fā)送測試信息");
return new MySql();
case "orcale":? // 如果是oracle的話 執(zhí)行orcale的連接步驟
System.out.println("測試數(shù)據(jù)庫練級效率");
return new Oracle();
case "sqlserver": //如果是sqlserver的話 執(zhí)行sqlserver的連接步驟
System.out.println("發(fā)送測試信息");
System.out.println("測試數(shù)據(jù)庫練級效率");
return new SqlServer();
default:
break;
}
}
return null;
}
//校驗用戶名密碼是否正確
public boolean checkMessage(){
System.out.println("用戶名密碼檢測中....");
if("hanchun".equals(userName)&&"123456".equals(password)){
System.out.println("用戶名密碼校驗成功....");
return true;
}else{
System.out.println("用戶名密碼校驗失敗....");
}
return false;
}
}