1. 程式人生 > >java 設計模式之簡單工廠模式(含樣例源碼)

java 設計模式之簡單工廠模式(含樣例源碼)

ace org build cep 說明 pad 客戶 enc trac

簡單工廠模式的目的:使得對象的創建和使用分離,降低系統耦合,對用戶隱藏類的實例創建細節

簡單工廠模式屬於創建型模式的一種

簡單工廠模式的定義:定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有相同的父類

簡單工廠模式包含的3個角色:

1)工廠角色:即工廠類,負責實現創建所有產品實例的內部邏輯

2)抽象產品角色:工廠類創建的所有對象的父類,封裝了各種產品對象公有的方法

3)具體產品角色::工廠需要創建的東西,繼承了抽象產品角色,需要實現抽象產品角色中聲明的抽象方法

在沒有工廠類之前客戶端一直使用new關鍵字直接創建產品對象,而在引入了工廠類之後客戶端可以通過工廠類來創建產品,根據傳入不同的參數創建不同的產品對象

實例如下:

實例說明:建立一個圖表庫,目前有三種圖表,柱狀圖(HistongramChart),餅狀圖(PieChart),折線圖(LineChart),要求方便進行擴展!

1.抽象圖表接口,充當抽象產品類

package 簡單工廠模式;
/**
 *@author YB
 *@version 2019年3月15日下午6:17:29    
 */
/*
 * 抽象圖表接口,充當抽象產品類 ,具體產品類必須實現抽象產品類實現的方法
 */
public interface Chart {
    public void display();
}

2.柱狀圖類,充當具體產品類

package 簡單工廠模式;
/**
 *@author YB
 *@version 2019年3月15日下午6:19:29    
 */
/*
 * 柱狀圖類,充當具體產品類
 */
public class HistongramChart implements Chart{

    public HistongramChart() {
        // TODO Auto-generated constructor stub
        System.out.println("創建柱狀圖");
    }
    @Override
    public
void display() { // TODO Auto-generated method stub System.out.println("顯示柱狀圖"); } }

3.餅狀圖類,充當具體產品類

package 簡單工廠模式;
/**
 *@author YB
 *@version 2019年3月15日下午6:22:30    
 */
/*
 * 餅狀圖類,充當具體產品類
 */
public class PieChart implements Chart{

    public PieChart() {
        // TODO Auto-generated constructor stub
        System.out.println("創建餅狀圖");
    }
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("顯示餅狀圖");
    }

}

4.折線圖類,充當具體產品類

package 簡單工廠模式;
/**
 *@author YB
 *@version 2019年3月15日下午6:24:37    
 */
/*
 * 折線圖類,充當具體產品類
 */
public class LineChart implements Chart {

    public LineChart() {
        // TODO Auto-generated constructor stub
        System.out.println("創建折線圖");
    }
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("顯示折線圖");
    }

}

5.圖表工廠類,根據傳入的不同字符創建不同的產品

package 簡單工廠模式;
/**
 *@author YB
 *@version 2019年3月15日下午6:28:05    
 */
/*
 * 圖表工廠類,根據傳入的不同字符創建不同的產品
 * String.equalsIgnoreCase 不區別大小寫
 */
public class ChartFactory {
    
    public static Chart getChart(String type) {//靜態工廠方法
        Chart chart=null;
        if(type.equalsIgnoreCase("histogram")) {
            chart=new HistongramChart();
            System.out.println("初始化設置柱狀圖");
        }else if(type.equalsIgnoreCase("pie")) {
            chart=new PieChart();
            System.out.println("初始化設置餅狀圖");
        }else if(type.equalsIgnoreCase("line")) {
            chart=new LineChart();
            System.out.println("初始化設置折線圖");
        }
        return chart;
    }
}

6.客戶端測試類

package 簡單工廠模式;
/**
 *@author YB
 *@version 2019年3月15日下午7:01:31    
 */
/*
 * 客戶端測試類
 */
public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Chart chart;
        /*
         * 只需修改配置文件,無需修改任何代碼,符合開閉原則
         */
        String type=XMLUtil.getCharType();//讀取配置文件中的參數 
        chart=ChartFactory.getChart(type);//創建產品對象
        chart.display();
    }

}

7.XMLUtil工具類:讀取配置文件中的字符

package 簡單工廠模式;

import java.io.File;

import javax.swing.text.Document;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.soap.Node;

import org.w3c.dom.NodeList;

/**
 *@author YB
 *@version 2019年3月15日下午7:08:17    
 */
public class XMLUtil {
    //該方法用於從XML配置文件中提取圖表類型,並返回類型名
    public static String getCharType() {
        try {
            //創建文檔對象
            DocumentBuilderFactory dFactory=DocumentBuilderFactory.newInstance();
            DocumentBuilder builder=dFactory.newDocumentBuilder();
            org.w3c.dom.Document doc=builder.parse(new File("src//簡單工廠模式//config.xml"));
            
            //獲取包含圖表類型的文本節點
            NodeList nlList= doc.getElementsByTagName("charType");
            org.w3c.dom.Node classNode=nlList.item(0).getFirstChild();
            String charType=classNode.getNodeValue().trim();
            return charType;
            
        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return null;
        }
    }
}

8.配置文件

<?xml version="1.0" encoding="UTF-8"?>
<config>
<charType>pie</charType>
</config>

簡單工廠模式的優點:

1.工廠類包含必要的判斷邏輯,可以決定什麽時候創建哪一個產品的實例,客戶端可以免除直接創建產品對象,而僅僅負責消費產品

2.引入配置文件,可以在不修改客戶端代碼的情況下更換和增加新的具體產品類

簡單工廠模式的缺點:

1.工廠類職責過重,一旦工廠類出問題會影響很大

2.會增加系統中類的個數(引入新的工廠類)增加系統復雜度

3.系統擴展困難,一旦添加新產品就要修改工廠類的邏輯,產品類較多時邏輯會比較復雜

代碼下載:鏈接:https://share.weiyun.com/5NiEhDD 密碼:tyh9u5

java 設計模式之簡單工廠模式(含樣例源碼)