2019獨角獸企業重金招聘Python工程師標準>>>
一.工廠方法模式
工廠方法模式屬于創建型模式。
工廠方法模式定義:定義一個用于創建對象的借口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到了他的子類。
一般工廠類會有一個工廠的接口,實現類也有一個實現的接口。工廠接口負責定義一個創建實現接口的方法,而工廠類負責創建具體的實現類。
工廠模式根據抽象程度的不同分為三種:簡單工廠模式(也叫靜態工廠模式),工廠方法模式以及抽象工廠模式。工廠模式是編程中經常會遇到的一種模式。
工廠方法模式的優點有:
使代碼結構清晰,有效的封裝變化。在編程中,產品類的實例化有時候是復雜多變的,通過工廠模式將產品的實例化封裝起來,是的調用者無需關心實例化過程只需依賴工廠即可得到自己想要的產品。
對調用者屏蔽具體的產品類。如果使用工廠模式,調用者只需要關心產品的接口就可以了,即使變更了具體的實現,對調用這來說沒有任何影響。
工廠方法模式符合開放封閉原則,迪米特法則,依賴倒置原則。
二.測試代碼
測試代碼如下(實現一個計算器)下屬模式中,如果新增了其他的計算類,只需要新建一個計算類實現,和相應的計算類工廠就可以了。
public?class?GongChangMethodTest?{public?static?void?main(String[]?args)?{IFactory?factory?=?new?SumFactory();Jisuan?jisuan?=?factory.createJisuan();jisuan.setNum1(12);jisuan.setNum2(44);;System.out.println(jisuan.getResult());} }interface?IFactory?{Jisuan?createJisuan(); }class?SumFactory?implements?IFactory?{@Overridepublic?Jisuan?createJisuan()?{return?new?SumJisuan();}}class?SubFactory?implements?IFactory?{@Overridepublic?Jisuan?createJisuan()?{return?new?SubJisuan();} }class?MulFactory?implements?IFactory?{@Overridepublic?Jisuan?createJisuan()?{return?new?MulJisuan();} }class?DevFactory?implements?IFactory?{@Overridepublic?Jisuan?createJisuan()?{return?new?DevJisuan();} }abstract?class?Jisuan?{private?int?num1;private?int?num2;public?Jisuan()?{}public?Jisuan(int?num1,?int?num2)?{this.num1?=?num1;this.num2?=?num2;}public?abstract?int?getResult();public?int?getNum1()?{return?num1;}public?void?setNum1(int?num1)?{this.num1?=?num1;}public?int?getNum2()?{return?num2;}public?void?setNum2(int?num2)?{this.num2?=?num2;} }class?SumJisuan?extends?Jisuan?{@Overridepublic?int?getResult()?{return?getNum1()?+?getNum2();}}class?SubJisuan?extends?Jisuan?{@Overridepublic?int?getResult()?{return?getNum1()?-?getNum2();} }class?MulJisuan?extends?Jisuan?{@Overridepublic?int?getResult()?{return?getNum1()?*?getNum2();} }class?DevJisuan?extends?Jisuan?{@Overridepublic?int?getResult()?{int?result?=?0;if?(getNum2()?!=?0)?{result?=?getNum1()?/?getNum2();}return?result;} }
企業級應用中,我們對數據庫的實現就可以采用上述模式
實際上,我們再加上其他表,IFactory中再增加createXXXFactory就成了抽象工廠模式了,抽象工廠只是比工廠方法多了一個緯度而已
public?class?GongChangMethodTest?{public?static?void?main(String[]?args)?{IFactory?factory=new?MysqlUserFactory();IUserService?service=factory.createUserService();service.insert();}
}
interface?IUserService{void?insert();
}
class?UserService?implements?IUserService{@Overridepublic?void?insert()?{System.out.println("insert?方法");}
}
interface?IFactory{public?IUserService?createUserService();
}
abstract?class?MysqlFactory?implements?IFactory{//這里可以做一些初始化mysql連接的事情
}
abstract?class?SqlServerFactory?implements?IFactory{//這里可以做一些初始化mysql連接的事情
}
//如果想換成sqlserver,只需要加一個SqlserverUserFactory就可以了
class?MysqlUserFactory?extends?MysqlFactory{@Overridepublic?IUserService?createUserService()?{return?new?UserService();}}