java設計模式的分類
在java中,設計模式有三十三種之多,分為三大類:
- 建立性模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
- 結構性模式,共七種:擴充卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
- 行為型模式,共十一種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。
今天主要說一下最常用的模式之一:工廠設計模式
工廠設計模式
一、成因
在日常開發中,接口的使用是避免不掉的,我們先來看一下最常用的一種使用方式:
假設我們現在要設計一個水果的接口:IFruit,有一個吃水果的方法:eat()
public interface IFruit{
void eat();
}
該接口有一個子類:Apple
public class Apple implements IFruit{
@Overwrite
public void eat(){
System.out.println("吃蘋果!");
}
}
接下來我們通過執行個體化子對象來調用接口IFruit
public void Demo{
public static void main(String args[]) {
IFruit fruit = new Apple();
fruit.eat(); // 吃蘋果!
}
}
到此為止,一個接口的簡單使用就算完了,上面的代碼看着熟悉嗎。就是我們經常使用的方式,這麼寫有問題嗎?有!就是沒有考慮代碼的耦合性!
我在剛學習java開發的時候,記得老師說過最深刻的一句話就是:
想要寫出高品質的代碼,就一定要注意代碼的高内聚,低耦合
假如IFruit又有一個實作類:Orange
public class Orange implements IFruit{
@Overwrite
public void eat(){
System.out.println("吃橘子!");
}
}
這時候如果要切換IFruit的實作,就隻能改代碼了:
public void Demo{
public static void main(String args[]) {
// IFruit fruit = new Apple();
// fruit.eat(); // 吃蘋果!
IFruit fruit = new Orange ();
fruit.eat(); // 吃橘子!
}
}
這顯然不是我們想要的方式,如果IFruit有成百上千的實作,那切換起來豈不是要累死,這時候,就能展現出工廠設計模式的好處了。
二、使用
在以上的基礎上,我們再建立一個類:Factory,裡面有一個參數為className傳回值為IFruit的方法:getInstance()
public class Factory{
// 該方法用來建立IFruit 接口對象
// 傳入一個className來聲明你想調用的實作
public static IFruit getInstance(String className) {
if ("apple".equals(className)) {
return new Apple();
}
if ("orange".equals(className)) {
return new Orange();
}
return null;
}
}
改造我們的main方法為:
public void Demo{
public static void main(String args[]) {
// 此處我們使用argn作為參數傳入對象
if (args.length != 1) {
// 判斷是否傳入參數,沒有參數則退出程式
Sysytem.out.println("參數不能為空!");
System.exit(1);
}
IFruit fruit = Factory.getInstance(args[1]);
fruit.eat();
}
}
在控制台中使用:
// 編譯
java Demo
// 執行并傳入參數
javac Demo apple // 結果:吃蘋果
javac Demo orange // 結果:吃橘子
以上,便實作了我們的工廠設計模式,可以發現,我們隻需要傳入不同的參數,就可以調用不同的實作,而不需要再修改main中的方法,進而實作了一種代碼解耦!
ps:以上代碼僅說明問題,不保證能直接跑,畢竟部落客隻是在寫文章的時候直接手敲的,難免會有疏忽???