定義
定義一個(gè)用于創(chuàng)建對象的接口,讓子類決定實(shí)例化那個(gè)類
UML類圖
[圖片上傳失敗...(image-72a8db-1517713140864)]
解讀:
- Product: 產(chǎn)品抽象類,
- ConcreteProduct: 產(chǎn)品實(shí)現(xiàn)類
- Creator: 工廠抽象類, 返回一個(gè)Product實(shí)例
- ConcreteCreator: 工廠實(shí)現(xiàn)類, 返回一個(gè)ConcreteProduct實(shí)例
簡單實(shí)現(xiàn)
Fruit: 作為產(chǎn)品抽象類
public abstract class Fruit {
abstract void getName();
}
Banana: 作為產(chǎn)品實(shí)現(xiàn)類
public class Banana extends Fruit {
@Override
void getName() {
System.out.println("I am banana");
}
}
Apple: 作為產(chǎn)品實(shí)現(xiàn)類
public class Apple extends Fruit {
@Override
void getName() {
System.out.println("I am apple");
}
}
FruitFactory: 作為抽象工廠類
public abstract class FruitFactory {
abstract Fruit createFruit();
}
AppleFactory: 作為工廠實(shí)現(xiàn)類
public class AppleFactory extends FruitFactory {
@Override
Fruit createFruit() {
return new Apple();
}
}
BananaFactory: 作為工廠實(shí)現(xiàn)類
public class BananaFactory extends FruitFactory {
@Override
Fruit createFruit() {
return new Banana();
}
}
使用
在需要哪一個(gè)產(chǎn)品時(shí)就生產(chǎn)哪個(gè)
FruitFactory fruitFactory = new AppleFactory();
Fruit apple = fruitFactory.createFruit();
apple.getName();
使用反射
FruitFactory
public abstract class FruitFactory {
abstract <T extends Fruit> T createFruit(Class<T> className);
}
ConcreteFruitFactory: 具體工廠類
public class ConcreteFruitFactory extends FruitFactory {
@Override
<T extends Fruit> T createFruit(Class<T> className) {
Fruit fruit = null;
try {
fruit = (Fruit)Class.forName(className.getName()).newInstance();
}catch (Exception e){
e.printStackTrace();
}
return (T)fruit;
}
}
使用
需要哪個(gè)類對象就傳入那個(gè)類的類型
FruitFactory fruitFactory = new ConcreteFruitFactory();
Fruit apple = fruitFactory.createFruit(Apple.class);
apple.getName();
簡單工廠方法模式
當(dāng)工廠只有一個(gè)的時(shí)候, 只需將對應(yīng)的工廠方法改為靜態(tài)方法, 并去掉abstract關(guān)鍵字, 此時(shí)就變成了簡單工廠模式或者靜態(tài)工廠模式
public class FruitFactory {
static Fruit createFruit(){
return new Apple();
}
}