【設計模式系列-建立型模式篇】-工廠方法模式
阿新 • • 發佈:2018-11-25
工廠方法模式定義
工廠方法模式的使用頻率非常高,在我們日常的開發過程中總能見到它的身影。其定義為:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses. 定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類。
工廠方法模式應用場景
工廠方法模式是通過new關鍵字建立物件的替代品,所有需要生產物件的地方都可以使用,但是需要慎重考慮是否要增加一個工廠類進行管理,因為這勢必會增加程式碼的複雜度。
工廠方法模式應用例項
/** * 抽象運算類 */ public abstract class Operation { // 兩個數之間的運算 public abstract double operate(double a,double b); }
/** * 加法實現類 */ public class AddOperation extends Operation { @Override public double operate(double a, double b) { return a + b; } }
/*** 減法實現類 */ public class SubOperation extends Operation { @Override public double operate(double a, double b) { return a - b; } }
/** * 乘法實現類 */ public class MulOperation extends Operation { @Override public double operate(double a, double b) { return a * b; } }
/** * 除法實現類 */ public class DivOperation extends Operation { @Override public double operate(double a, double b) { if (b != 0){ return a/b; } return 0; } }
/** * 抽象運算工廠類 */ public abstract class AbstractOperationFactory { public abstract <T extends Operation> T createOperation(Class <T> c); }
/** * 具體工廠實現 */ public class OperationFactory extends AbstractOperationFactory { @Override public <T extends Operation> T createOperation(Class <T> c) { Operation operation = null; try { operation = (Operation) Class.forName(c.getName()).newInstance(); } catch (Exception e) { System.out.println("獲取運算類異常"); } return (T) operation; } }
/** * 測試類 */ public class MainTest { @Test public void test(){ AbstractOperationFactory abstractOperationFactory = new OperationFactory(); Operation addOperation = abstractOperationFactory.createOperation(AddOperation.class); System.out.println(addOperation.operate(1,2)); Operation subOperation = abstractOperationFactory.createOperation(SubOperation.class); System.out.println(subOperation.operate(3,2)); Operation mulOperation = abstractOperationFactory.createOperation(MulOperation.class); System.out.println(mulOperation.operate(2,4)); Operation divOperatipon = abstractOperationFactory.createOperation(DivOperation.class); System.out.println(divOperatipon.operate(6,3)); } }
通過這個例項可以體驗工廠方法模式的優點:
1、良好的封裝性,程式碼結構清晰,一個物件的建立是有條件約束的,呼叫著需要獲取一個具體的產品物件,只要知道這個產品的類名就可以了,不用知道建立物件等等艱辛過程,降低模組間的耦合。
2、良好的擴充套件性,在增加產品類的情況下,只要適當修改具體工廠類或擴充套件一個工廠類,就可以輕鬆擁抱變化。
3、遮蔽產品類,產品類的實現如何變化,呼叫者都不需要關心,只需要關心產品類的介面,只要介面不變,系統中的上層模組就不要發生變化。
4、工廠方法模式是典型的解耦框架,高層模組只需要知道產品的抽象類,其他的實現類都不用關心。