簡單工廠模式:
定義一個工廠類,它可以根據不同的參數返回不同類的實例,被創建的實例通常都具有共同的父類。
簡單工廠模式結構比較簡單:包含三個核心角色,Factory,Prodcut,ConcreteProduct(具體產品角色)
下面用一個簡單的例子來模擬一下工廠模式的實現
首先定義抽象產品類
package SimpleFactoryPattern;
//抽象產品類
public interface Chart {
public void display();
}
接下來定義產品類
package SimpleFactoryPattern;
public class LineChart implements Chart {
public LineChart(){
System.out.println("init LineChart...");
}
@Override
public void display() {
System.out.println("display LineChart...");
}
}
package SimpleFactoryPattern;
public class HistogramChart implements Chart {
public HistogramChart(){
System.out.println("init HistogramChart...");
}
@Override
public void display() {
System.out.println("display HistogramChart...");
}
}
package SimpleFactoryPattern;
public class PieChart implements Chart {
public PieChart(){
System.out.println("初始化柱形圖");
}
@Override
public void display() {
System.out.println("顯示柱形圖");
}
}
接下來定義工廠類
package SimpleFactoryPattern;
public class ChartFactory {
//靜態工廠方法
public static Chart getChart(String type){
Chart chart = null;
if(type.equalsIgnoreCase("LineChart")){
chart = new LineChart();
System.out.println("init setting LineChart...");
}
else if(type.equalsIgnoreCase("PieChart")){
chart = new PieChart();
System.out.println("init setting PieChart...");
}
else if(type.equalsIgnoreCase("HistogramChart")){
chart = new HistogramChart();
System.out.println("init setting HistogramChart...");
}
return chart;
}
}
最後寫測試類
package SimpleFactoryPattern;
//測試
public class Window {
public static void main(String[] args) {
Chart chart;
chart = ChartFactory.getChart("LineChart");
chart.display();
// String chartType = XMLUtil.getChartType();
// Chart chart1 = ChartFactory.getChart(chartType);
// chart1.display();
}
}
這裏可以使用配置文件的方式,可以讓客戶端自行更改產品,而不修改代碼
<?xml version="1.0" encoding="utf-8" ?>
<config>
<chartType>HistogramChart</chartType>
</config>
再通過工具類XMLUtil讀取配置文件中的字符串參數
package SimpleFactoryPattern;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static String getChartType(){
try {
//創建文檔對象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc;
//解析配置文件
doc = db.parse(new File("src/SimpleFactoryPattern/config.xml"));
NodeList list = doc.getElementsByTagName("chartType");
//獲取文本結點
Node classNode = list.item(0).getFirstChild();
String chartType = classNode.getNodeValue().trim();
return chartType;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
測試
package SimpleFactoryPattern;
//測試
public class Window {
public static void main(String[] args) {
// Chart chart;
// chart = ChartFactory.getChart("LineChart");
// chart.display();
String chartType = XMLUtil.getChartType();
Chart chart1 = ChartFactory.getChart(chartType);
chart1.display();
}
}
簡單工廠模式的結構圖
總結:
簡單工廠模式的優點
1.工廠類的判斷邏輯可以決定什麽時候創建產品,而客戶端衹需要去獲得產品,將對象的創建與使用過程分離開來
2.客戶端無需知道創建對象的具體類型,衹需要知道簡單的參數即可
3.通過引入配置文件在不修改代碼的前提下即可獲取產品類,提高了系統的靈活性。
缺點:
1.工廠類負責所有產品的創建,職責過重,若不能正工作,會影響整個系統的運行。
2.會增加系統中類的個數
3.系統擴展困難,添加產品時要修改工廠類的邏輯
4.靜態工廠方法無法形成繼承結構