工廠方法模式(Factory Method)车摄,定義一個用于創(chuàng)建對象的接口净嘀,讓子類決定實例化哪一個類狂魔。工廠方法使一個類的實例化延遲到其子類没宾。
工廠方法模式的核心是封裝類中不變的部分凌彬,將可變的部分獨立成額外的類,將實際的創(chuàng)建工作延遲到之類當中循衰,代碼會相對靈活一些铲敛。
工廠方法模式涉及到4個部分:
- 產(chǎn)品接口:定義產(chǎn)品規(guī)范,通常是接口或抽象類会钝。
- 具體產(chǎn)品:實現(xiàn)產(chǎn)品接口的具體類伐蒋。
- 工廠接口:定義實例化產(chǎn)品類的規(guī)范,通常是接口或抽象類迁酸。
- 具體工廠:實現(xiàn)工廠接口的具體類先鱼,決定實例化何種產(chǎn)品。
筆者下文例子中的頻道類對應了產(chǎn)品接口奸鬓,卡通頻道和新聞頻道是具體產(chǎn)品焙畔,而頻道工廠則相當于工廠接口,卡通頻道工廠和新聞頻道工廠起到了具體工廠的作用串远。
- 頻道
public interface Channel {
void watch();
}
- 卡通頻道
public class Cartoon implements Channel {
@Override
public void watch() {
System.out.print("watch cartoon");
}
}
- 新聞頻道
public class News implements Channel {
@Override
public void watch() {
System.out.print("watch news");
}
}
- 頻道工廠
public interface ChannelFactory {
Channel createChannel();
}
- 卡通頻道工廠
public class CartoonFactory implements ChannelFactory {
@Override
public Channel createChannel() {
return new Cartoon();
}
}
- 新聞頻道工廠
public class NewsFactory implements ChannelFactory {
@Override
public Channel createChannel() {
return new News();
}
}
- 客戶端測試類
public class Client {
public static void main(String[] args) {
ChannelFactory channelFactory = new CartoonFactory();
Channel channel = channelFactory.createChannel();
channel.watch();
}
}
運行結(jié)果:
watch cartoon
工廠方法模式之比于簡單工廠模式宏多,工廠方法模式實現(xiàn)時,客戶端需要決定實例化哪一個工廠來創(chuàng)建產(chǎn)品實現(xiàn)類澡罚,選擇判斷的問題還是存在伸但。也就是說,工廠方法把簡單工廠的內(nèi)部邏輯判斷移到了客戶端代碼來進行留搔。你想要加功能更胖,本來是改工廠類,而現(xiàn)在是修改客戶端催式。
簡單工廠模式還是存在著對修改的開放問題函喉,而工廠方法模式更好地實現(xiàn)了開閉原則。
但是工廠方法模式顯著地增加了類的數(shù)量荣月,每一個產(chǎn)品都需要對應一個工廠管呵。并且增加了客戶端調(diào)用類的負擔,客戶端調(diào)用類需要知道各個工廠的存在哺窄。