緒論
其實很早以前就看過一些關於設計模式的文章,知道這個很重要,爲此還寫了一些demo,但是在實際開發過程中基本沒有使用過。原因:不習慣,不記得,其實更多的是不明白什麼情況下可以使用。所以導致自己的代碼又臭又長,還會重複的造一些輪子,使代碼看起來毫無亮點。
這次學習設計模式,更多的是分析理解,思考以往編程中哪些地方可以用到這些模式,從而可以使以後的自己在開發相同模塊時可以使用。
理解
工廠方法模式又稱多態性工廠模式。是簡單工廠模式的衍生。
由於增加了工廠接口,每個實現的工廠之間相互獨立,互不影響,增強了可擴展性。
- 創建具體工廠。
- 工廠創建對象。
- 對象執行操作。
代碼
IFactory.java
package com.factory;
// 工廠接口
public interface IFactory {
public Workflow createWorkflow();
}
LeaveFactory.java
package com.factory;
// 請假工廠
public class LeaveFactory implements IFactory {
@Override
public Workflow createWorkflow() {
return new LeaveWorkflow();
}
}
SealFactory.java
package com.factory;
// 蓋章工廠
public class SealFactory implements IFactory {
@Override
public Workflow createWorkflow() {
return new SealWorkflow();
}
}
Workflow.java
package com.factory;
// 審批工作流接口
public interface Workflow {
// 啓動
public void startProcess();
// 審批
public void approveProcess();
}
LeaveWorkflow.java
package com.factory;
// 請假
public class LeaveWorkflow implements Workflow {
@Override
public void startProcess() {
System.out.println("提交請假審批");
}
@Override
public void approveProcess() {
System.out.println("審批請假信息");
}
}
SealWorkflow.java
package com.factory;
// 蓋章
public class SealWorkflow implements Workflow {
@Override
public void startProcess() {
System.out.println("提交蓋章審批");
}
@Override
public void approveProcess() {
System.out.println("審批蓋章信息");
}
}
package com.factory;
public class Main {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Workflow seal = getWorkflow1("com.factory1.SealFactory");
seal.startProcess();
seal.approveProcess();
Workflow leave = getWorkflow2(LeaveFactory.class);
leave.startProcess();
leave.approveProcess();
}
public static Workflow getWorkflow1(String className) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
Class<?> c = Class.forName(className);
IFactory factory = (IFactory)c.newInstance();
return factory.createWorkflow();
}
public static Workflow getWorkflow2(Class<?> c) throws InstantiationException, IllegalAccessException{
IFactory factory = (IFactory)c.newInstance();
return factory.createWorkflow();
}
}
結果
這樣的話,可以在配置文件裏面進行不同的配置,使用不同的工廠,有點像數據庫配置。
(若有什麼錯誤,請留言指正,3Q)