工廠方法模式
定義
定義一個(gè)用于創(chuàng)建對(duì)象的接口,讓子類決定實(shí)例化哪一個(gè)類。工廠方法使一個(gè)類的實(shí)例化延遲到其他子類庶溶。
通用類圖
工廠方法.png
通用代碼
- 抽象產(chǎn)品類
public abstract Product {
public void method() {} // 抽象產(chǎn)品的公有方法
public abstract method2();
}
- 具體產(chǎn)品類
public ConcreteProduct1 extends Product {
public abstract method2() {
// 具體邏輯
}
}
public ConcreteProduct2 extends Product {
public abstract method2() {
// 具體邏輯
}
}
- 抽象工廠類
public abstract class Creator {
public abstract <T extends Product> T createProduct(Class<?> c);
}
- 具體工廠類
public class ConcreteCreator extends Creator {
public abstract <T extends Product> T createProduct(Class<?> c) {
Product product = null;
try {
product = (Product)Class.forName(c.getInstance()).newInstance();
} catch(Expection e) {
// 異常處理
}
return (T)product;
}
}
- 使用
public static void main(String[] args) {
Creator creator = new ConcreteCreator();
Product product = creator.createProduct(ConcreteProduct1.class);
}
樣例展示
現(xiàn)在召喚師峽谷需要一批英雄宅此,有法師、戰(zhàn)士褐捻、刺客什么的掸茅,那么我們就可以這樣使用工廠方法模式。
英雄工廠方法.png
先定義一個(gè)抽象的英雄:
public abstract class Hero {
public abstract void attack();
}
要?jiǎng)?chuàng)造英雄總得創(chuàng)造設(shè)備吧柠逞,所以定義一個(gè)工廠:
public abstract class Creator {
public abstract <T extends Hero> T createHero(Class<?> c);
}
接下來是創(chuàng)造出具體的東西:
// 具體工廠
public class HeroCreator extends Creator {
@Override
public <T extends Hero> T createHero(Class<?> c) {
Hero hero = null;
try {
hero = (Hero) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T)hero;
}
}
// 具體英雄
public class Mage extends Hero { // 法師
@Override
public void attack() {
System.out.println("法術(shù)傷害");
}
}
public class Shooter extends Hero { // 射手
@Override
public void attack() {
System.out.println("物理攻擊");
}
}
最后是客戶端調(diào)用
public class Client {
public static void main(String[] args) {
Creator creator = new HeroCreator();
Hero hero = creator.createHero(Mage.class);
hero.attack();
}
}
當(dāng)然昧狮,我們也可以升級(jí)一下,變成多個(gè)工廠類板壮,以下是類圖逗鸣,代碼就不寫了。
多個(gè)工廠類.png
本文為《設(shè)計(jì)模式之禪》讀后筆記總結(jié)