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 詳見後續博客: