簡單工廠模式--Java設計模式

簡單工廠模式:

定義一個工廠類,它可以根據不同的參數返回不同類的實例,被創建的實例通常都具有共同的父類。

簡單工廠模式結構比較簡單:包含三個核心角色,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.靜態工廠方法無法形成繼承結構

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值