一、定義
與簡單工廠的區別:簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇條件動態實例化相關的類,對於客戶端來說,去除了與具體產品的依賴。
工廠方法模式,定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。
工廠方法模式實現時,客戶端需要決定實例化哪一個工廠來實現運算類,選擇判斷的問題還是存在的,也就是說,工廠方法把簡單工廠的內部邏輯判斷移到了客戶端代碼來進行。你想要加功能,本來時改工廠類的,而現在時修改客戶端。
二、UML類圖
三、實現
- 工廠接口類
package com.jthao.design.des.factorymethod;
public interface IFactory {
public LeiFeng createLeifeng();
}
- 具體工廠類A
package com.jthao.design.des.factorymethod;
public class VolunteerFactory implements IFactory {
@Override
public Volunteer createLeifeng() {
return new Volunteer();
}
}
- 具體工廠類B
package com.jthao.design.des.factorymethod;
public class UndergraduateFactory implements IFactory {
@Override
public Undergraduate createLeifeng() {
return new Undergraduate();
}
}
- 對象接口類
package com.jthao.design.des.factorymethod;
public class LeiFeng {
public void sweep() {
System.out.println("掃地");
}
public void wash() {
System.out.println("洗衣");
}
public void buyRice() {
System.out.println("買米");
}
}
- 具體對象A
package com.jthao.design.des.factorymethod;
public class Volunteer extends LeiFeng {
public void sweep() {
System.out.println("志願者掃地");
}
public void wash() {
System.out.println("志願者洗衣");
}
public void buyRice() {
System.out.println("志願者買米");
}
}
- 具體對象B
package com.jthao.design.des.factorymethod;
public class Undergraduate extends LeiFeng {
public void sweep() {
System.out.println("大學生掃地");
}
public void wash() {
System.out.println("大學生洗衣");
}
public void buyRice() {
System.out.println("大學生買米");
}
}
- 測試類
package com.jthao.design.des.factorymethod;
public class factorymethodTest {
public static void main(String[] args) {
IFactory factory = new UndergraduateFactory();
LeiFeng leifeng = factory.createLeifeng();
leifeng.sweep();
IFactory factory2 = new VolunteerFactory();
leifeng = factory2.createLeifeng();
leifeng.buyRice();
leifeng.wash();
}
}