//MagicWeapon.java
// 魔法武器介面
public interface MagicWeapon {
void enchant();
void use();
String getElement();
String getType();
}
//FireSword.java
// 火焰劍
public class FireSword implements MagicWeapon {
@Override
public void enchant() {
System.out.println("火元素精靈注入烈焰之力...");
}
@Override
public void use() {
System.out.println("火焰劍爆發出炙熱的劍氣,灼燒敵人!");
}
@Override
public String getElement() {
return "火焰";
}
@Override
public String getType() {
return "烈焰長劍";
}
}
//WaterBow.java
// 水流弓
public class WaterBow implements MagicWeapon {
@Override
public void enchant() {
System.out.println("水元素精靈灌注流水之韻...");
}
@Override
public void use() {
System.out.println("水流弓射出冰冷的箭矢,穿透敵人!");
}
@Override
public String getElement() {
return "水流";
}
@Override
public String getType() {
return "潮汐長弓";
}
}
//EarthStaff.java
// 大地法杖
public class EarthStaff implements MagicWeapon {
@Override
public void enchant() {
System.out.println("土元素精靈凝聚大地之力...");
}
@Override
public void use() {
System.out.println("大地法杖召喚岩石風暴,震撼戰場!");
}
@Override
public String getElement() {
return "大地";
}
@Override
public String getType() {
return "磐石法杖";
}
}
//ElfForgemaster.java
// 精靈鑄造師抽象類別
public abstract class ElfForgemaster {
// 工廠方法 - 由子類別實現具體的創建邏輯
protected abstract MagicWeapon createMagicWeapon();
// 模板方法 - 定義武器製作的完整流程
public final MagicWeapon forgeWeapon() {
System.out.println("=== 精靈鑄造師開始工作 ===");
// 準備工作
prepareWorkshop();
// 委託給子類別創建具體武器
MagicWeapon weapon = createMagicWeapon();
// 統一的後處理
weapon.enchant();
finalizeWeapon(weapon);
return weapon;
}
private void prepareWorkshop() {
System.out.println("準備魔法工坊,點燃元素火焰...");
}
private void finalizeWeapon(MagicWeapon weapon) {
System.out.println("為 " + weapon.getType() + " 加上精靈祝福");
System.out.println("武器鍛造完成!\n");
}
}
//FireElementForgemaster.java
// 火元素精靈鑄造師
public class FireElementForgemaster extends ElfForgemaster {
@Override
protected MagicWeapon createMagicWeapon() {
System.out.println("召喚火元素精靈協助鍛造...");
return new FireSword();
}
}
//WaterElementForgemaster.java
// 水元素精靈鑄造師
public class WaterElementForgemaster extends ElfForgemaster {
@Override
protected MagicWeapon createMagicWeapon() {
System.out.println("召喚水元素精靈協助鍛造...");
return new WaterBow();
}
}
//EarthElementForgemaster.java
// 土元素精靈鑄造師
public class EarthElementForgemaster extends ElfForgemaster {
@Override
protected MagicWeapon createMagicWeapon() {
System.out.println("召喚土元素精靈協助鍛造...");
return new EarthStaff();
}
}
//FactoryPatternExample.java
// 使用範例
public class FactoryPatternExample {
public static void main(String[] args) {
System.out.println("=== 歡迎來到精靈王國的魔法工坊 ===");
// 創建不同的精靈鑄造師
ElfForgemaster fireForgemaster = new FireElementForgemaster();
ElfForgemaster waterForgemaster = new WaterElementForgemaster();
ElfForgemaster earthForgemaster = new EarthElementForgemaster();
// 讓每個鑄造師鍛造專屬武器
MagicWeapon fireSword = fireForgemaster.forgeWeapon();
MagicWeapon waterBow = waterForgemaster.forgeWeapon();
MagicWeapon earthStaff = earthForgemaster.forgeWeapon();
// 測試武器功能
System.out.println("=== 武器測試 ===");
testWeapon(fireSword);
testWeapon(waterBow);
testWeapon(earthStaff);
}
private static void testWeapon(MagicWeapon weapon) {
System.out.println("測試武器: " + weapon.getType() + " (" + weapon.getElement() + "屬性)");
weapon.use();
System.out.println();
}
/**output
=== 歡迎來到精靈王國的魔法工坊 ===
=== 精靈鑄造師開始工作 ===
準備魔法工坊,點燃元素火焰...
召喚火元素精靈協助鍛造...
火元素精靈注入烈焰之力...
為 烈焰長劍 加上精靈祝福
武器鍛造完成!
=== 精靈鑄造師開始工作 ===
準備魔法工坊,點燃元素火焰...
召喚水元素精靈協助鍛造...
水元素精靈灌注流水之韻...
為 潮汐長弓 加上精靈祝福
武器鍛造完成!
=== 精靈鑄造師開始工作 ===
準備魔法工坊,點燃元素火焰...
召喚土元素精靈協助鍛造...
土元素精靈凝聚大地之力...
為 磐石法杖 加上精靈祝福
武器鍛造完成!
=== 武器測試 ===
測試武器: 烈焰長劍 (火焰屬性)
火焰劍爆發出炙熱的劍氣,灼燒敵人!
測試武器: 潮汐長弓 (水流屬性)
水流弓射出冰冷的箭矢,穿透敵人!
測試武器: 磐石法杖 (大地屬性)
大地法杖召喚岩石風暴,震撼戰場!
*/
}
// 魔法武器基類
class MagicWeapon {
enchant() {
throw new Error("子類必須實現 enchant 方法");
}
use() {
throw new Error("子類必須實現 use 方法");
}
getElement() {
throw new Error("子類必須實現 getElement 方法");
}
getType() {
throw new Error("子類必須實現 getType 方法");
}
}
// 火焰劍
class FireSword extends MagicWeapon {
enchant() {
console.log("火元素精靈注入烈焰之力...");
}
use() {
console.log("火焰劍爆發出炙熱的劍氣,灼燒敵人!");
}
getElement() {
return "火焰";
}
getType() {
return "烈焰長劍";
}
}
// 水流弓
class WaterBow extends MagicWeapon {
enchant() {
console.log("水元素精靈灌注流水之韻...");
}
use() {
console.log("水流弓射出冰冷的箭矢,穿透敵人!");
}
getElement() {
return "水流";
}
getType() {
return "潮汐長弓";
}
}
// 大地法杖
class EarthStaff extends MagicWeapon {
enchant() {
console.log("土元素精靈凝聚大地之力...");
}
use() {
console.log("大地法杖召喚岩石風暴,震撼戰場!");
}
getElement() {
return "大地";
}
getType() {
return "磐石法杖";
}
}
// 精靈鑄造師抽象類別
class ElfForgemaster {
// 工廠方法 - 由子類別實現具體的創建邏輯
createMagicWeapon() {
throw new Error("子類必須實現 createMagicWeapon 方法");
}
// 模板方法 - 定義武器製作的完整流程
forgeWeapon() {
console.log("=== 精靈鑄造師開始工作 ===");
// 準備工作
this.prepareWorkshop();
// 委託給子類別創建具體武器
const weapon = this.createMagicWeapon();
// 統一的後處理
weapon.enchant();
this.finalizeWeapon(weapon);
return weapon;
}
prepareWorkshop() {
console.log("準備魔法工坊,點燃元素火焰...");
}
finalizeWeapon(weapon) {
console.log(`為 ${weapon.getType()} 加上精靈祝福`);
console.log("武器鍛造完成!");
}
}
// 火元素精靈鑄造師
class FireElementForgemaster extends ElfForgemaster {
createMagicWeapon() {
console.log("召喚火元素精靈協助鍛造...");
return new FireSword();
}
}
// 水元素精靈鑄造師
class WaterElementForgemaster extends ElfForgemaster {
createMagicWeapon() {
console.log("召喚水元素精靈協助鍛造...");
return new WaterBow();
}
}
// 土元素精靈鑄造師
class EarthElementForgemaster extends ElfForgemaster {
createMagicWeapon() {
console.log("召喚土元素精靈協助鍛造...");
return new EarthStaff();
}
}
// 使用範例
console.log("=== 歡迎來到精靈王國的魔法工坊 ===");
// 創建不同的精靈鑄造師
const fireForgemaster = new FireElementForgemaster();
const waterForgemaster = new WaterElementForgemaster();
const earthForgemaster = new EarthElementForgemaster();
// 讓每個鑄造師鍛造專屬武器
const fireSword = fireForgemaster.forgeWeapon();
const waterBow = waterForgemaster.forgeWeapon();
const earthStaff = earthForgemaster.forgeWeapon();
// 武器測試函數
function testWeapon(weapon) {
console.log(`測試武器: ${weapon.getType()} (${weapon.getElement()}屬性)`);
weapon.use();
console.log();
}
// 測試武器功能
console.log("=== 武器測試 ===");
testWeapon(fireSword);
testWeapon(waterBow);
testWeapon(earthStaff);
/** output
=== 歡迎來到精靈王國的魔法工坊 ===
=== 精靈鑄造師開始工作 ===
準備魔法工坊,點燃元素火焰...
召喚火元素精靈協助鍛造...
火元素精靈注入烈焰之力...
為 烈焰長劍 加上精靈祝福
武器鍛造完成!
=== 精靈鑄造師開始工作 ===
準備魔法工坊,點燃元素火焰...
召喚水元素精靈協助鍛造...
水元素精靈灌注流水之韻...
為 潮汐長弓 加上精靈祝福
武器鍛造完成!
=== 精靈鑄造師開始工作 ===
準備魔法工坊,點燃元素火焰...
召喚土元素精靈協助鍛造...
土元素精靈凝聚大地之力...
為 磐石法杖 加上精靈祝福
武器鍛造完成!
=== 武器測試 ===
測試武器: 烈焰長劍 (火焰屬性)
火焰劍爆發出炙熱的劍氣,灼燒敵人!
測試武器: 潮汐長弓 (水流屬性)
水流弓射出冰冷的箭矢,穿透敵人!
測試武器: 磐石法杖 (大地屬性)
大地法杖召喚岩石風暴,震撼戰場!
*/
Factory Pattern(工廠模式)就像我們故事中的嚴謹精靈鑄造師,透過抽象工廠類別將物件創建的責任委託給子類別
forgeWeapon()
forgeWeapon()
之中使用了工廠方法 createMagicWeapon()
來製造武器createMagicWeapon()
方法(達成客製化的需求~)核心特點:
與 Simple Factory 的差異:
特徵 | Simple Factory | Factory Pattern |
---|---|---|
創建方式 | 靜態方法 + switch | 抽象類別 + 子類別 |
擴展性 | 需修改工廠類別 | 新增工廠子類別 |
開放封閉原則 | 不符合 | 符合 |
複雜度 | 簡單 | 較複雜 |
使用時機:
注意事項: