標籤:抽象原廠模式 abstract factory java原始碼 建型設計模式 gof設計模式
一、描述
抽象原廠模式是在Factory 方法的模式上進一步抽象而來,如果說Factory 方法模式是對一個產品結構的建立而言的話,那麼抽象原廠模式則是針對多個產品結構而言的,它被用來一次建立多個不同的產品對象。
我們要建立一個>機車輪胎和>機車把手,又要建立一個單車輪胎和單車把手,如果我們使用Factory 方法模式的話我們需要四個類:建立>機車輪胎的工廠類,建立>機車把手的工廠類,建立單車輪胎的工廠類和建立單車把手的工廠類,但是如果我們使用抽象Factory 方法的話,我們需要建立兩個工廠類:建立>機車輪胎和把手的工廠類,建立單車輪胎和把手的工廠類,也就是將Factory 方法進一步抽象,所有>機車產品歸為一類,所有單車產品歸為一類。如果還要建立>機車的車座和單車的車座,那麼我們只要在>機車類和單車類中分別加入一個建立車座的方法即可。
抽象原廠模式適用於建立不同產品的多個結構,使用抽象工廠類負責定義建立對象的介面,這一系列對象的建立工作是由有是實現抽象工廠的具體工廠類來具體完成,抽象原廠模式主要由4部分組成:抽象工廠類,實現抽象工廠類的具體工廠類,抽象類別和實現抽象類別的具體類。
二、抽象原廠模式的優缺點
優點:在抽象方法模式中,用戶端不再負責對象的建立工作,而是把這個任務交給了具體的工廠類,從而減輕了用戶端的負擔,也明確了各個類的職責。在這個模式中同一個產品的多個不同組件放在一個工廠類中,這樣用戶端的調用就變得非常簡單,而且如果要修改或者增加這些組件就只要修改對應的一個工廠類和實現該工廠類的具體子類即可。
缺點:每次有新的組件加入都需要修改抽象工廠類的設計,同時也要修改實現這個抽象工廠類的所有具體工廠類,需要額外編碼增加了代碼量。如果每個抽象工廠類中建立的產品數量非常大,在用戶端組裝各個具體工廠建立的對象的時候就會很複雜,導致用戶端代碼非常龐大。
三、原始碼
總述:對於上一篇博文中採用Factory 方法模式編寫的薪資計算系統代碼,我此次採用抽象工廠的模式,並且我們不僅要計算薪資還要計算社保,也就是有一個抽象工廠類,該類中有兩個抽象方法,分別計算薪資和社保,然後有兩個分公司類工廠類用於建立自己公司的薪資和社保對象。
1、抽象工廠類
package tong.day5_1.abstractFactory;/** *抽象的工廠介面,在這個介面中定義了一個兩個抽象方法,分別建立薪資類對象和社保類對象,由實現該介面的具體類重寫該方法,分別建立自己類的對象 * @author tong * */public interface AbstractFactory {//抽象方法,用於建立各種類的對象public abstract Salary createSalary();public abstract Insurance createInsurance();}2、具體工廠類
package tong.day5_1.abstractFactory;public class GuangdongFactory implements AbstractFactory {@Overridepublic Salary createSalary() {return new GuangdongSalary();}@Overridepublic Insurance createInsurance() {return new GuangdongInsurance();}}
package tong.day5_1.abstractFactory;/** * 具體工廠類實現抽象工廠中的所有方法,並返回該類的薪資對象和社保對象 * @author Administrator * */public class ZhejiangFactory implements AbstractFactory {@Overridepublic Salary createSalary() {return new ZhejiangSalary();}@Overridepublic Insurance createInsurance() {return new ZhejiangInsurance();}}3、抽象薪資類
package tong.day5_1.abstractFactory;/** * 定義一個薪資介面,所有公司的具體薪資計算都實現這個介面,並重寫計算薪資的方法computeSalary() * @author tong * */public interface Salary {public void computeSalary();}4、兩個公司的具體薪資類
package tong.day5_1.abstractFactory;/** * 廣東分公司的薪資計算類實現了Salary介面,並重寫了該介面中的計算薪資的方法computeSalary() * @author tong * */public class GuangdongSalary implements Salary {@Overridepublic void computeSalary() {System.out.println("廣東分公司薪資計算");}}
package tong.day5_1.abstractFactory;/** * 浙江分公司的薪資計算類實現了Salary介面,並重寫了該介面中的計算薪資的方法computeSalary() * @author tong * */public class ZhejiangSalary implements Salary {@Overridepublic void computeSalary() {System.out.println("浙江分公司薪資計算");}}5、抽象社保類
package tong.day5_1.abstractFactory;/** * 抽象社保類 * @author tong * */public interface Insurance {public abstract void computeInsurance();}6、兩個子公司的具體社保類
package tong.day5_1.abstractFactory;public class GuangdongInsurance implements Insurance {@Overridepublic void computeInsurance() {System.out.println("廣東分公司社會保險計算");}}
package tong.day5_1.abstractFactory;public class ZhejiangInsurance implements Insurance {@Overridepublic void computeInsurance() {System.out.println("浙江分公司社會保險計算");}}7、用戶端調用
package tong.day5_1.abstractFactory;public class Client {public static void main(String[] args) {//建立抽象工廠類,使用多態,首先建立浙江分公司的工廠類對象AbstractFactory factory = new ZhejiangFactory();//使用浙江分公司的工廠類建立該公司的薪資和社保對象Salary salary = factory.createSalary();Insurance insurance = factory.createInsurance();//使用建立出來的薪資和社保對象分別調用計算薪資和計算社保的具體方法salary.computeSalary();insurance.computeInsurance();System.out.println("----------------");//建立抽象工廠類,使用多態,建立廣東分公司的工廠類對象factory = new GuangdongFactory();//使用廣東分公司的工廠類建立該公司的薪資和社保對象salary = factory.createSalary();insurance = factory.createInsurance();//使用建立出來的薪資和社保對象分別調用計算薪資和計算社保的具體方法salary.computeSalary();insurance.computeInsurance();}}
三、運行結果
java語言實現建立型設計模式—抽象原廠模式