java 設計模式之簡單工廠模式(含樣例源碼)
簡單工廠模式的目的:使得對象的創建和使用分離,降低系統耦合,對用戶隱藏類的實例創建細節
簡單工廠模式屬於創建型模式的一種
簡單工廠模式的定義:定義一個工廠類,它可以根據參數的不同返回不同類的實例,被創建的實例通常都具有相同的父類
簡單工廠模式包含的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 publicvoid 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 設計模式之簡單工廠模式(含樣例源碼)