天天看點

java二十三種設計模式——工廠設計模式java設計模式的分類

java設計模式的分類

在java中,設計模式有三十三種之多,分為三大類:

  1. 建立性模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
  2. 結構性模式,共七種:擴充卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
  3. 行為型模式,共十一種:政策模式、模闆方法模式、觀察者模式、疊代子模式、責任鍊模式、指令模式、備忘錄模式、狀态模式、通路者模式、中介者模式、解釋器模式。

今天主要說一下最常用的模式之一:工廠設計模式

工廠設計模式

一、成因

在日常開發中,接口的使用是避免不掉的,我們先來看一下最常用的一種使用方式:

假設我們現在要設計一個水果的接口: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:以上代碼僅說明問題,不保證能直接跑,畢竟部落客隻是在寫文章的時候直接手敲的,難免會有疏忽???

繼續閱讀