參考:設計模式之禪
1. 例子
人類接口:
public interface Human {
void getColor();
void talk();
}
各個人種:
public class YellowHuman implements Human {
@Override
public void getColor() {
System.out.println("YellowHuman is yellow");
}
@Override
public void talk() {
System.out.println("YellowHuman talk");
}
}
public class WhiteHuman implements Human {
@Override
public void getColor() {
System.out.println("WhiteHuman is white");
}
@Override
public void talk() {
System.out.println("WhiteHuman talk");
}
}
public class BlackHuman implements Human {
@Override
public void getColor() {
System.out.println("BlackHuman is black");
}
@Override
public void talk() {
System.out.println("BlackHuman talk");
}
}
工廠:
public abstract class AbstractHumanFactory {
public abstract <T extends Human> T createHuman(Class<T> c);
}
public class HumanFactory extends AbstractHumanFactory {
@Override
public <T extends Human> T createHuman(Class<T> c) {
T instance = null;
try {
instance = (T) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
System.out.println("創建人類失敗");
}
return instance;
}
}
女媧造人:
public class NvWa {
public static void main(String[] args) {
HumanFactory humanFactory = new HumanFactory();
YellowHuman yellowHuman = humanFactory.createHuman(YellowHuman.class);
WhiteHuman whiteHuman = humanFactory.createHuman(WhiteHuman.class);
BlackHuman blackHuman = humanFactory.createHuman(BlackHuman.class);
yellowHuman.getColor();
yellowHuman.talk();
whiteHuman.getColor();
whiteHuman.talk();
blackHuman.getColor();
blackHuman.talk();
}
}
2. 定義和特點
定義一個創建對象的接口,讓子類決定實例化哪個類。工廠方法使得類的實例化延遲到子類。
有以下特點:
- 良好的封裝性,代碼結構清晰,調用者只需知道產品的類名或其他字符串就可以創建產品對象,不需要了解產品的創建過程;
- 擴展性優秀,可以擴展產品,像上面就可以增加棕色人種;
符合以下三個原則;
- 迪米特原則,工廠模式不需要對產品瞭解;
- 依賴倒置原則,只依賴產品的接口或者抽象類;
- 里氏替換原則,創建產品的方法參數是接口或抽象類。
3. 工廠模式的擴展
3.1 簡單工廠模式
也叫靜態工廠模式。