為了將 Chart 類的職責(zé)分離,同時(shí)將 Chart 對(duì)象的創(chuàng)建和使用分離,Sunny 軟件公司開發(fā)人員決定使用簡(jiǎn)單工廠模式對(duì)圖表庫進(jìn)行重構(gòu),重構(gòu)后的結(jié)構(gòu)如圖所示:
http://wiki.jikexueyuan.com/project/design-pattern-creation/images/20130711144554265.jpg" alt="圖表庫結(jié)構(gòu)圖" />
在圖中,Chart 接口充當(dāng)抽象產(chǎn)品類,其子類HistogramChart、PieChart 和 LineChart 充當(dāng)具體產(chǎn)品類,ChartFactory 充當(dāng)工廠類。完整代碼如下所示:
//抽象圖表接口:抽象產(chǎn)品類
interface Chart {
public void display();
}
//柱狀圖類:具體產(chǎn)品類
class HistogramChart implements Chart {
public HistogramChart() {
System.out.println("創(chuàng)建柱狀圖!");
}
public void display() {
System.out.println("顯示柱狀圖!");
}
}
//餅狀圖類:具體產(chǎn)品類
class PieChart implements Chart {
public PieChart() {
System.out.println("創(chuàng)建餅狀圖!");
}
public void display() {
System.out.println("顯示餅狀圖!");
}
}
//折線圖類:具體產(chǎn)品類
class LineChart implements Chart {
public LineChart() {
System.out.println("創(chuàng)建折線圖!");
}
public void display() {
System.out.println("顯示折線圖!");
}
}
//圖表工廠類:工廠類
class ChartFactory {
//靜態(tài)工廠方法
public static Chart getChart(String type) {
Chart chart = null;
if (type.equalsIgnoreCase("histogram")) {
chart = new HistogramChart();
System.out.println("初始化設(shè)置柱狀圖!");
}
else if (type.equalsIgnoreCase("pie")) {
chart = new PieChart();
System.out.println("初始化設(shè)置餅狀圖!");
}
else if (type.equalsIgnoreCase("line")) {
chart = new LineChart();
System.out.println("初始化設(shè)置折線圖!");
}
return chart;
}
}
編寫如下客戶端測(cè)試代碼:
class Client {
public static void main(String args[]) {
Chart chart;
chart = ChartFactory.getChart("histogram"); //通過靜態(tài)工廠方法創(chuàng)建產(chǎn)品
chart.display();
}
}
編譯并運(yùn)行程序,輸出結(jié)果如下:
創(chuàng)建柱狀圖!
初始化設(shè)置柱狀圖!
顯示柱狀圖!
在客戶端測(cè)試類中,我們使用工廠類的靜態(tài)工廠方法創(chuàng)建產(chǎn)品對(duì)象,如果需要更換產(chǎn)品,只需修改靜態(tài)工廠方法中的參數(shù)即可,例如將柱狀圖改為餅狀圖,只需將代碼:
chart = ChartFactory.getChart("histogram");
改為:
chart = ChartFactory.getChart("pie");
編譯并運(yùn)行程序,輸出結(jié)果如下:
創(chuàng)建餅狀圖!
初始化設(shè)置餅狀圖!
顯示餅狀圖!