Java總結之設計模式(工廠模式)

1.Java設計模式分類

  1.1 創建型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。

  1.2 結構型模式(7種):適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。

  1.3 行爲型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

2.簡單(靜態)模式

 2.1 簡單(靜態)工廠:不通過 new 創建對象實例, 而是用一個靜態方法來對外提供自身實例的方法,即爲我們所說的靜態工廠方法(Static factory method) ;舉個栗子:通過輸入球員號碼來輸出球員的描述,傳統做法,if等判斷再去逐個new出對象;這裏使用簡單工廠模式來實現:

    2.1.1 設計抽象基類或者接口Player,

package org.ssm.java.designPattern.factory.simpleFactory;

/*
 * 抽象基類:球員模板
 * */
public abstract class Player {

	/*球員描述*/
	public abstract void desc();
}

    2.1.2 實現類,具體的球員類

    首先是曼巴科比:

package org.ssm.java.designPattern.factory.simpleFactory;

import org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.WorksheetDocumentImpl;

public class Kobe extends Player {

	@Override
	public void desc() {
		System.out.println("曼巴科比,偏執好勝!");
	}

}

    其次是詩人麥迪:

package org.ssm.java.designPattern.factory.simpleFactory;

public class Tmac extends Player {

	@Override
	public void desc() {

		System.out.println("T-Macs麥迪,飄逸詩人!");
	}

}

再者是詹皇勒布朗:

package org.ssm.java.designPattern.factory.simpleFactory;

public class James extends Player {

	@Override
	public void desc() {
		System.out.println("勒布朗·詹皇,出道即巔峯!");

	}

}

最後是其他球員,路人甲:

package org.ssm.java.designPattern.factory.simpleFactory;

public class otherPlayer extends Player {

	@Override
	public void desc() {

		System.out.println("潛力新秀、角色球員?不重要的路人甲吧!");
	}

}

    2.1.3 準備就緒,關鍵時刻,你想看誰的描述都可以:創建簡單工廠類

package org.ssm.java.designPattern.factory.simpleFactory;

public class SimplePlayerFactory {
	
	/*勒布朗·詹姆斯*/
	public static final int NUM_23 = 23; 
	
	/*特雷西·麥克格雷迪*/
	public static final int NUM_1 = 1;
	
	/*科比·布萊恩特*/
	public static final int NUM_24 = 24;
	
	public static Player createPlayer(int num) {
		switch (num) {
		case NUM_1:
			return new Tmac();
		case NUM_23:
			return new Kobe();
		case NUM_24:
			return new James();
		default:
			return new otherPlayer();
		}
	}
	

	public static void main(String[] args) {
		/**
		 * 簡單工廠模式
		 */
		
		/*我要看麥迪的描述*/
		Player Tmac = SimplePlayerFactory.createPlayer(SimplePlayerFactory.NUM_1);
		Tmac.desc();
		
		/*我要看科比的描述*/
		Player kobe = SimplePlayerFactory.createPlayer(SimplePlayerFactory.NUM_23);
		kobe.desc();
	}
}

    2.1.4 輸出結果

    2.1.5 總結:

    1)球員類:抽象類+繼承類;

    2)工廠類:核心類,是一個具體的類,用來創建球員類實例; 

    3)優點:方便創建 同種類型接口產品 的 複雜對象;

    4)不足:在擴展更多的球員類時,除了要創建具體的球員類以外,還要修改工廠類的實現方法createPlayer(),而且不同類型的對象創建也不適應;

3.工廠方法模式

 3.1 工廠方法在簡單工廠的基礎上再包了一層工廠,所有的工廠都是此工廠的子類;而產生對象的類型由子類工廠決定。是不是有點繞?其實就是把創建科比的工作分到科比的工廠類。。。類推,不在由單一工廠類根據參數去統一創建,再看一下栗子:

 3.2 先創建工廠基類

package org.ssm.java.designPattern.factory;

/*工廠基類:球員工廠*/
public abstract class PlayerFractory {

	public abstract Player createPlayer();
}

3.3 具體的球員工廠類

package org.ssm.java.designPattern.factory;

/*創建科比工廠類*/
public class KobePlayerFractory extends PlayerFractory {

	@Override
	public Player createPlayer() {
		return new Kobe();
	}

}
package org.ssm.java.designPattern.factory;

/*創建麥迪工廠*/
public class TmacPlayerFractory extends PlayerFractory {

	@Override
	public Player createPlayer() {
		return new Tmac();
	}

}
package org.ssm.java.designPattern.factory;

/*創建詹姆斯工廠*/
public class JamesPlayerFractory extends PlayerFractory {

	@Override
	public Player createPlayer() {
		return new James();
	}

}

 3.4 客戶端代碼

package org.ssm.java.designPattern.factory;

/*客戶端測試工廠類*/
public class MethodFactory {

	public static void main(String[] args) {
		/*
		1.創建科比的工廠類。。。好彆扭;
		2.創建球員科比;
		3.調用方法,輸出球員描述;
		*/
		PlayerFractory playerFractory = new KobePlayerFractory();
		Player player = playerFractory.createPlayer();
		player.desc();
             //控制檯輸出:曼巴科比,偏執好勝!
	}

}


4.抽象工廠模式

4.1 詳見後續博客:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章