Java設計模式-簡單工廠模式/工廠模式/抽象工廠模式
阿新 • • 發佈:2018-12-04
目錄
上述程式碼 GitHub 地址:https://github.com/baicun/designPatterns
共同點:建立一個類,對同樣操作的方法介面進行封裝,類似工廠管理生產線等情形。
優點:方便管理,易於拓展。
應用:資料庫訪問,我們只需要更換驅動包就可以。
簡單工廠模式
建立一個類,對同樣的操作進行封裝。
示例:
公共介面:
//公共介面
public interface Send {
public void send();
}
實現類:
//傳送簡訊 public class SmsSend implements Send { @Override public void send() { System.out.println("傳送簡訊成功"); } }
//傳送郵件
public class MailSend implements Send {
@Override
public void send() {
System.out.println("傳送郵件成功");
}
}
工廠類:
//工廠類 public class SendFactory { public Send produce(String type) { if ("mail".equals(type)) { return new MailSend(); } else if ("sms".equals(type)) { return new SmsSend(); } else { System.out.println("請輸入正確的型別!"); return null; } } }
測試:
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Send send = factory.proceMail();
send.send();
}
上面的程式碼就是實現簡單工廠模式。每當我們建立一個傳送一條資訊,首先輸入傳送型別,然後便可以傳送成功,這樣人為的錯誤比較高,隨便一個字母輸入錯誤就失敗了。接下來看工廠模式。
工廠模式
//簡單工廠類 public class SimpleFactory { //傳送郵件 public Send proceMail(){ return new MailSend(); } //傳送簡訊 public Send proceSms(){ return new SmsSend(); } }
測試:
public static void main(String[] args) {
SimpleFactory factory = new SimpleFactory();
Send send = factory.proceMail();
send.send();
}
如此實現工廠模式,已經很棒了,但是違反了設計模式原則,對拓展開放,對修改關閉!最後看最優模式。
抽象工廠模式
個人覺得抽象工廠模式可以理解為是對工廠模式的二層封裝。請看下面程式碼,以傳送郵件為例。
共倆個介面,最初介面:
//公共介面
public interface Send {
public void send();
}
在增加提供一個介面:
//抽象介面
public interface Provider {
public Send produce(String type);//傳送型別
}
介面的實現類
//QQ郵件實現類
public class SendMailQqImpl implements Send{
@Override
public void send() {
System.out.println("傳送QQ郵件");
}
}
//126郵件實現類
public class SendMail126Impl implements Send{
@Override
public void send() {
System.out.println("傳送126郵件");
}
}
工廠類;
//郵件工廠類
public class SendMailFactory implements Provider{
public Send produce(String type){
//如果 type=qq,則傳送qq郵件,否則傳送126郵件
if("qq".equals(type)){
return new SendMailQqImpl();
}else{
return new SendMail126Impl();
}
}
}
測試:
// 測試
public static void main(String[] args) {
Provider provider = new SendMailFactory();//例項化工廠
Send mailsend = provider.produce("qq");//得到實現方法
mailsend.send();//執行介面方法
}
以後我們在新增一個功能的話,只要建立一個實現 Send 介面的實現類,以及實現 Provider 的工廠類就可以拓展了。