java語言實現創建型設計模式―創建者模式
來源:程序員人生 發布時間:2015-06-06 08:17:24 閱讀次數:3265次
1、描寫
創建者模式單獨利用1個創建者類來創建對象并組建對象之間的關系,以簡化客戶端調用的復雜性。相對抽象方法模式來講,創建者模式增加了1個單獨的用于組裝對象和對象之間關系的創建者類,由該類來負責對象的組裝,以此來更加清晰地劃分各個類的職責。
創建者模式將1個復雜對象的構建和它的表示分離,使得一樣的構建進程可以創建不同的表示,而且對客戶端屏蔽了對象的構建細節,該模式主要由5個部份組成:組裝類、抽象創建者類,實現了抽象創建者類的具體創建者類,抽象產品類、實現了抽象產品類的具體產品類。在此可以看出與抽象方法模式相比多了1個組裝類。
2、創建者模式的優缺點
優點:在創建者模式中客戶端不再負責對象的創建和組裝,而是由1個具體的組裝類來完成這項功能,將組裝的責任交給組裝類,客戶端只負責對象的調用,從而更加明確了各個類的職責。
缺點:利用創建者模式可以創建出不同類型的產品,但是如果要創建的產品差異非常大就需要編寫多個創建者類來實現,這無疑增加了代碼的復雜性,而且創建者類只是在構造相干部件的發雜關系上有優勢,如果要增加1個部件還是需要改變原本的代碼,增加新的模塊。
3、源代碼
總述:1個公司有計算薪金和社保需求,我們有多個分公司,每一個分公司都要計算這兩項,現在我們需要創建分公司對象,利用各個對象調用各個公司計算這兩項業務的方法來得出結果,我需要以下幾個類:抽象工廠類(定義創建對象的接口),兩個子公司的具體工廠類(實現了抽象工廠類中創建對象的方法來產生具體的對象),抽象薪資類(定義薪資計算的標準接口),兩個子公司的具體薪資類(實現抽象薪資類中計算薪資的方法),抽象社保類(定義社保計算的標準接口),兩個子公司的具體社保類(實現抽象社保類中計算社保的方法),組裝類(負責對象的創建和兌現直接關系的組裝),客戶端調用類(用來調用組裝類組裝對象并調用相應的實現類方法)。
1、抽象工廠類
package tong.day5_1.builder;
/**
*抽象的工廠接口,在這個接口中定義了1個兩個抽象方法,分別創建薪資類對象和社保類對象,由實現該接口的具體類重寫該方法,分別創建自己類的對象
* @author tong
*
*/
public interface AbstractFactory {
//抽象方法,用于創建各種類的對象
public abstract Salary createSalary();
public abstract Insurance createInsurance();
}
2、具體工廠類package tong.day5_1.builder;
public class GuangdongFactory implements AbstractFactory {
@Override
public Salary createSalary() {
return new GuangdongSalary();
}
@Override
public Insurance createInsurance() {
return new GuangdongInsurance();
}
}
package tong.day5_1.builder;
/**
* 具體工廠類實現抽象工廠中的所有方法,并返回該類的薪資對象和社保對象
* @author tong
*
*/
public class ZhejiangFactory implements AbstractFactory {
@Override
public Salary createSalary() {
return new ZhejiangSalary();
}
@Override
public Insurance createInsurance() {
return new ZhejiangInsurance();
}
}
3、抽象薪資類
package tong.day5_1.builder;
/**
* 定義1個薪資接口,所有公司的具體薪資計算都實現這個接口,并重寫計算薪資的方法computeSalary()
* @author tong
*
*/
public interface Salary {
public void computeSalary();
}
4、具體薪資類
package tong.day5_1.builder;
/**
* 廣東分公司的薪資計算類實現了Salary接口,并重寫了該接口中的計算薪資的方法computeSalary()
* @author tong
*
*/
public class GuangdongSalary implements Salary {
@Override
public void computeSalary() {
System.out.println("廣東分公司薪資計算");
}
}
package tong.day5_1.builder;
/**
* 浙江分公司的薪資計算類實現了Salary接口,并重寫了該接口中的計算薪資的方法computeSalary()
* @author tong
*
*/
public class ZhejiangSalary implements Salary {
@Override
public void computeSalary() {
System.out.println("浙江分公司薪資計算");
}
}
5、抽象社保類package tong.day5_1.builder;
/**
* 抽象社保類
* @author tong
*
*/
public interface Insurance {
public abstract void computeInsurance();
}
6、具體社保類
package tong.day5_1.builder;
public class GuangdongInsurance implements Insurance {
@Override
public void computeInsurance() {
System.out.println("廣東分公司社會保險計算");
}
}
package tong.day5_1.builder;
public class ZhejiangInsurance implements Insurance {
@Override
public void computeInsurance() {
System.out.println("浙江分公司社會保險計算");
}
}
6、組裝類
package tong.day5_1.builder;
/**
* 這里使用1個組裝類來簡化客戶端創建對象、初始化對象和構建對象之間的關系
* @author tong
*
*/
public class Builder {
private AbstractFactory abstractFactory;
//根據傳入的參數肯定初始化哪一個公司的工廠類對象,這里使用多態,根據傳入的參數動態創建相應的對象
public Builder(AbstractFactory abstractFactory) {
this.abstractFactory = abstractFactory;
}
//組裝的具體實現方法,調用類中計算薪金和社保的方法
public void moneySum() {
Salary salary = abstractFactory.createSalary();
salary.computeSalary();
Insurance insurance = abstractFactory.createInsurance();
insurance.computeInsurance();
}
}
7、客戶端調用類
package tong.day5_1.builder;
/**
* 客戶端在這里得到了簡化,不用再斟酌如何組裝創建和組裝對象,而只需要調用專門的組裝類來組裝對象
* @author tong
*
*/
public class Client {
public static void main(String[] args) {
//組裝浙江分公司的對象
Builder builder = new Builder(new ZhejiangFactory());
builder.moneySum();
System.out.println("--------------");
//組裝廣東分公司的對象
builder = new Builder(new GuangdongFactory());
builder.moneySum();
}
}
4、運行結果

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈