1. 程式人生 > >工廠模式(Factory Pattern)和java反射機制優化思考

工廠模式(Factory Pattern)和java反射機制優化思考

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">GOF的工廠模式是最基礎的一種建立型設計模式,其適用於建立同一介面的不同實現子類,</span>

其優點是:將使使用者更加方便使用,而不關心具體的建立邏輯

缺點是:每增加一個介面的子類,必須修改工程類的相關邏輯(後面我們用java的反射機制進行優化)


從上面UML圖看到,我們設定了一個Shape介面,並且實現了三個子類,我們通過ShapeFactory來根據不同的名稱返回不同的子類例項,通過FactoryPatternDemo進行的測試。邏輯很簡單,不再詳述。

public class ShapeFactory {
	
   //使用 getShape 方法獲取形狀型別的物件
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }		
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}

基於以上面ShapeFactory的實現,我們思考到,如果我們再增加一個子類實現,那麼ShapeFactory必須進行相應的修改原始碼,並重新進行編譯,這不是我們想要的結果。如果能不改變ShapeFactory的內容,而是將需要呼叫的子類寫在配置檔案中多好,這樣ShapeFactory從配置檔案中接收到需要返回的子類名稱,返回相應的子類例項。說到這裡,大家也許有點耳熟,這和spring中的依賴注入不很相似嗎,能想到這裡說明你很厲害了。不錯,這個就需要java的反射機制來實現(spring依賴注入的內部原理就是依賴java的反射機制),java.lang.Class類閃亮登場。

利於java.lang.Class類,我們可以通過Class.forName方法用類的詳細名稱(含包名)得到一個這個類的Class,之後就可以通過這個Class類進行一系列的操作了,例項化一個這個類的類物件newInstance()(呼叫不含引數的建構函式例項化),檢視他的構造方法Constructor,方法Method,成員變數Field,執行Method(可能需要java.lang.reflect中的類)。

回到上面,我們如何優化上面的工廠模式,思路是這樣的,首先將將要呼叫的子類名放到配置檔案中(好處是在改變呼叫的時候並不需要改變其他的程式碼),然後在Factory中用Class解析這個類,並例項化返回。最後在Demo中進行呼叫。思路很簡單

properties檔案如下:

shape.className=factoryPattern.Rectangle
Factory程式碼如下
public class ShapeFactory {
	public Shape getShape(String shapeClassName){
		Shape targetShape=null;
		Class oneClass=null;
		try {
			oneClass=Class.forName(shapeClassName);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("不能正確獲取類");
		}
		try {
			targetShape=(Shape) oneClass.newInstance();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("不能正確建立例項");
		}
		return targetShape;
	}
呼叫:
	public static void main(String[] args) {
		String targetClassName=ClassNameConfig.getProperty("shape.className");
		System.out.println("targetClassName:"+targetClassName);
		ShapeFactory shapeFactory=new ShapeFactory();
		Shape targetShape=shapeFactory.getShape(targetClassName);
		targetShape.draw();
	}
這樣,當修改呼叫子類時,只需要修改配置檔案即可。當然,對於簡單的工廠模式應用沒必要如此繁瑣
理解了這個,也就不難理解Spring的Ioc技術,Spring的配置檔案換成了xml檔案,而且設計比較複雜,呼叫程式變成了所謂的spring容器,當然這只是spring設計的基石,上層建築還是很複雜的。

相關推薦

工廠模式Factory Patternjava反射機制優化思考

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">GOF的工廠模式是最基礎的一種建立型設計模式,其適用於建立同一介面的不

設計模式學習——工廠模式Factory Pattern

cto ret cas .exe on() 生產 delet 基礎 names 1、有一個工廠,專門生產不同品牌的汽車。當有人需要從此工廠提貨的時候,只需要告訴他,要什麽品牌的,就可以了,並不關心這些車是怎麽生產出來的。 2、以上方式,如果增加品牌的時候,也要修改工廠,有點

工廠模式Factory Pattern

@override override 出現問題 其他 ram cto 介紹 暴露 給定 一、工廠模式(Factory Pattern)的介紹   工廠模式是我們最常用的實例化對象模式了,是用工廠方法代替new操作的一種模式。在工廠模式中,我們在創建對象時不會對客戶端暴露創建

工廠模式Factory Pattern:簡單&粗暴解析

1.前言 在之前的文章設計模式(Design pattern):簡單&粗暴解析中已經為大家深入淺出解析了 設計模式 的 七大原則、三大型別。 本文為大家解析三大型別中 建立型 裡其中的 工廠模式。 文章中例項  linhaojian的Githu

簡單工廠模式Factory Pattern

簡單工廠模式又 叫靜態工廠方法模式(Static FactoryMethod Pattern),是通過專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。  我們從一個例子展開,現在有一道面試題:使用java實現一個計算機控制檯程式,要求輸入數的運算,得到結果。&nbs

工廠模式Factory Pattern:簡單&粗暴解析

1.前言 2.目錄 3.含義 簡單工廠模式的擴充套件,設立不同的子工廠,建立對應的一個物件。 4.解決 1.“使用例項者”和“例項建立過程”解耦,讓使用者不需關心建立過程,在改變建立過程時,不影響使用者。 2.新增新物件,需要修改工廠類,違反

Python實現設計模式--02.工廠模式Factory Pattern

《設計模式》涉及到建立類的幾種模式,共同的也是最根本的原則就是:不要new物件!!!既然如此,告訴我你最先想到的是如何得到物件呢?沒錯,“你不讓我new,那你給我個get物件的工具吧,別的我不管”。這就是工廠模式,工廠模式是一種簡單又實用的模式,在各大框架到處可見,比如Ja

Head First 設計模式工廠模式Factory Pattern

前言:     除了使用new操作符之外,還有更多製造物件的方法。你將瞭解到例項化這個活動不應該總是公開的進行,也會意識到初始化會造成“耦合”的問題。工廠模式將會從複雜的依賴中幫你脫困。1.   簡單的工廠當看到“new”,就會想到“具體”,的確也是在例項化一個具體的類,而不

設計模式工廠模式Factory Pattern

工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面來指向新建立的物件。我這裡選擇生產手機的工廠作

設計模式——工廠模式Factory Pattern

工廠模式: 假如你是一家汽車公司的老闆,為了滿足世界各個國家的人的不同需要,在各個國家都建立了汽車生產工廠,每個工廠給該地區生產符合本地風格的汽車,那你的工廠和要生產的汽車是什麼樣的關係呢?讓我們用工廠模式通過Java來描述一下。 為了方便起見,現只在3個國家建立工廠Chi

【設計模式工廠模式Factory Pattern

什麽 接口 運行 不同 int 情況 att 不知道 local 【前言】 很多時候我們編寫了好幾個接口的實現類,這些實現類分別有不同特性,用在不同的情景下。**而我們對於這些實現類,也往往不會對外暴露內部增加的方法,只希望外部調用接口的方法,在這種情況下,我們沒必要讓調用

設計模式系列之三:工廠模式Factory Pattern

這是本系列的第三篇部落格,這次主要來說一下工廠模式。 基本工廠模式 簡單來說工廠模式是將工程中的相同型別物件的建立活動集中管理,一般通過反射來生成外界需要的實體類。比如Spring中的容器Bean概念,通過Spring BeanFactory來產生不同的Be

以C/C++語法淺談二十三種設計模式——工廠模式Factory Method

0.寫在前面 在軟體開發過程中,為了提高開發效率、增強軟體執行的穩定性,降低後期專案維護的成本,我們志在追求更加高效、簡單的設計思路來引領我們的專案產品,在經過不斷的探索與總結的過程中,我們最常用的設計模式有23中,總體分為三大類,即建立型模式、結構型模式和行為型模式,具體如下:

二級小兵——工廠模式Factory Method

前言   上一篇我們介紹了單例模式,今天給大家講一個比較簡單的模式——工廠模式(Factory Method),工廠模式又是什麼呢?顧名思義,工廠——生產製造東西的地方。那麼應用在程式當中該如何使用、並且又起到什麼效果呢?以至於為什麼用工廠模式呢?   之前

工廠模式Factory Method Pattern

n) 多態 產品 tel att new strac 代碼結構 減少 模式定義 工廠方法模式(Factory Method Pattern)又稱為工廠模式,也叫虛擬構造器(Virtual Constructor)模式或者多態工廠(Polymorphic Factory)模式

Java設計模式-工廠方法模式Factory Method

print blog -i pri cnp 三種模式 image void share 工廠方法模式(Factory Method) 工廠模式適合:凡是出現了大量的產品需要創建,並且具有共同的接口時,可以通過工廠方法模式進行創建。在以下的三種模式中,第一種如果傳入的字符串

Java 開發 設計模式 ----工廠方法模式Factory Method

工廠方法模式(Factory Method) 工廠方法模式分為三種: 11、普通工廠模式,就是建立一個工廠類,對實現了同一介面的一些類進行例項的建立。首先看下關係圖: 舉一個傳送郵件和簡訊的例子。首先,建立二者的共同介面: public interface Sender {

工廠方法模式Factory Method

method 客戶端代碼 console 實例化 turn 簡單工廠 actor () blog 工廠方法模式:定義一個用於創建對象的接口,讓子類來決定實例化哪一個類。工廠方法使一個類的實例化延遲到子類。 簡單工廠模式的最大有點在於工廠勒種包含了必要的邏輯判斷,根據客戶

java項目實戰】代理模式Proxy Pattern,靜態代理 VS 動態代理

自己 text 好的 trace use 代理 分類 plproxy this 這篇博文,我們主要以類圖和代碼的形式來對照學習一下靜態代理和動態代理。重點解析各自的優缺點。 定義 代理模式(Proxy Pattern)是對象的結構型模式,代理模

JAVA設計模式】外觀模式Facade Pattern

簡單 產生 creat ide oid dsm ref 功能 .net 一 定義 為子系統中的一組接口提供一個一致的界面。Facade模式定義了一個高層的接口,這個接口使得這一子系統更加easy使用。 二 案例 一個子系統中擁有3個模塊。每一個模塊