1. 程式人生 > >Java反射機制在工廠模式中的應用

Java反射機制在工廠模式中的應用

在本篇文章中就不詳細介紹工廠模式,主要介紹一下反射在工廠模式中的使用,讓讀者對反射機制帶來的好處有更深的認識。

首先看一下簡單工廠模式

簡單工廠模式(simple factory)是類的建立模式,又叫靜態工廠方法(static factory method)模式。

簡單工廠模式就是由一個工廠類根據傳入的引數決定建立哪一種的產品類。

簡單工廠模式例項:

//動物介面
interface Animal{
	public void speak();
}
//人實現類
class Man implements Animal{
	@Override
	public void speak() {
		System.out.println("我是人我會說話:哈哈哈!!!");
	}
}
//狗實現類
class Dog implements Animal{
	@Override
	public void speak() {
		System.out.println("我是小狗不會說話:汪汪汪!!!");
	}
}
//工廠類
class Factory{
	public Animal getAnimal(String name){
		if("man".equals(name)){
			return new Man();
		}else{
			return new Dog();
		}
	}
}
//測試類
public class GeneralFactory {
	public static void main(String[] args){
		Factory factory = new Factory();
		Animal an = factory.getAnimal("dog");
		an.speak();
	}
}
輸出結果:
我是小狗不會說話:汪汪汪!!!

上面程式碼中,定義了一個動物(Animal)介面,接著分別定義了人(Man)和狗(Dog)實現類,實現了speak()說話的方法。

如果我們現在不用工廠模式,在呼叫人的說話方法時需要new一個人(Man)的物件,使用狗的說話方式時,需要new一個狗(Dog)類的物件。

這樣在new物件時,就需要考慮到介面和子類的實現方式,增加了程式碼的耦合度。在程式碼中使用new操作其實也是一種硬編碼方式。

使用簡單工廠模式解決這個問題(上面的程式碼),封裝一個工廠類,把new物件的操作放在這個工廠類中,這樣我們在呼叫子類裡面的方法時,並不需要考慮子類的實現方式,只需要呼叫工廠類,讓工廠類給我們實現new物件的過程,使子類與外界操作沒有聯絡,降低程式碼耦合性。

大家應該也發現了簡單工廠模式有個很大的弊端,就是現在要實現很多動物的speak()方法,那麼工廠類裡面就要不斷的新增new物件的操作,修改裡面的程式碼,很顯然這樣並沒有達到我們理想的要求。可以使用Java的反射機制來解決。

採用反射機制的簡單工廠模式例項:

package com.qcjy.factory;

//動物介面
interface Animal1{
	public void speak();
}
//人實現類
class Man1 implements Animal{
	@Override
	public void speak() {
		System.out.println("我是人我會說話:哈哈哈!!!");
	}
}
//狗實現類
class Dog1 implements Animal{
	@Override
	public void speak() {
		System.out.println("我是小狗不會說話:汪汪汪!!!");
	}
}
//工廠類
class Factory1{
	public Object getAnimal(String className) throws Exception{
		Class<?> cls = Class.forName(className);
		Object obj = cls.newInstance();
		return obj;
	}
}
//測試類
public class ReflectFactory {
	public static void main(String[] args) throws Exception{
		Factory1 factory = new Factory1();
		Animal an = (Animal)factory.getAnimal("com.qcjy.factory.Man1");
		an.speak();
	}
}
輸出結果:
我是人我會說話:哈哈哈!!!
採用反射後,無論新增多少個子類,工廠類中的程式碼都不需要修改,只需要在操作的時候傳入子類的類路徑(包.類)就可以了,實現了各個業務邏輯之間的完全分離,程式碼耦合性進一步降低,很好的解決了上面的問題。

看到這裡,大家應該體會到了反射機制給我帶來的方便了吧,哈哈!

PS:工廠模式分為簡單工廠模式、工廠方法模式、抽象工廠模式。簡單工廠模式是對程式碼的自然封裝,比較容易理解,幾乎每個人都會用的上。真正算的上設計模式的是抽象工廠模式,但是大部分人都很少能用上抽象工廠模式。Spring框架中的IOC用到的就是簡單工廠模式。

相關推薦

java反射機制詳解和應用

1反射機制是什麼 反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制。 2反射機制能做什麼 反射機制主要提供了以下功能: 在執行

Java 反射工廠模式

一.簡單工廠模式 //介面 package Factory; public interface Fruit { public void eat(); //吃 } //實現介面類 package Factory; public class

java】Factory工廠模式應用

一、簡介工廠模式(factory)是設計模式的一種,它類比了工廠中的生產方式:對外只提供產品的選擇,整個產品的生成由內部完成。工廠模式由工廠方法和抽象工廠兩種實現方式。工廠模式簡單來說,就是使用一個工廠類來代替new關鍵字,完成對各種物件的例項化。這樣做的好處,就是可以避免重

Java反射機制工廠模式應用

在本篇文章中就不詳細介紹工廠模式,主要介紹一下反射在工廠模式中的使用,讓讀者對反射機制帶來的好處有更深的認識。 首先看一下簡單工廠模式 簡單工廠模式(simple factory)是類的建立模式,又叫靜態工廠方法(static factory method)模式。 簡單工廠

Java實現抽象工廠模式+java反射機制

Java的反射機制:   JAVA反射機制是就是執行的狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件

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

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

java反射機制及簡單工廠模式

This is Product A! This is Product B!以下方式,是未使用反射機制的簡單工廠類,根據判斷邏輯來建立具體產品 public class Factory{ public static Product getProduct(int product_index){ i

Java反射機制工廠模式

ati 發生 sna div 忽略 event 封裝 什麽是 可能 工廠模式屬於創建型模式,它提供了一種創建對象的最佳方式。 它的特點是:客戶端的程序類不直接牽扯到對象的實例化管理,只與接口發生關聯,通過工廠類獲取指定接口的實例化對象。 簡單工廠模式如下:

Java 反射在實際開發應用

放松 hello set 加載器 glib 應該 throwable tde ffffff   運行時類型識別(RTTI, Run-Time Type Information)是Java中非常有用的機制,在java中,有兩種RTTI的方式,一種是傳統的,即假設在編譯時已

Java反射機制demo(五)—獲得並調用一個類的方法

color 擁有 oca logs over super getmethod equals() bool 這個demo在使用反射機制操作屬性之前,主要原因是因為在.class文件字節碼中,方法排在屬性的前面。 1,獲得一個類中的方法 先看一下方法和運行結果。獲取所有的方

Java反射機制能夠獲取的信息,與應用

rri 代理 pan [] reflect 語言 子類 list tro 一、什麽是Java反射機制? 【1】反射機制是在運行狀態中,對於任何一個類,都能夠知道這個類的所有屬性和方法; 【2】對於任意一個對象,都能夠調用它的任意一個屬性和方法; 像這種動態獲取類的信

[轉]Java 反射在實際開發應用

擴展 pub 多對一 容器 redis 連接 一起 odin mapping 一:Java類加載和初始化 1.1 類加載器(類加載的工具) 1.2 Java使用一個類所需的準備工作 二:Java中RTTI   2.1 :為什麽要用到運行時類型信息

Java反射機制的簡單應用

mod arc pos ret system containe java反射機制 track san 一直感覺java的反射機制非常強大,可是可用的地方不多。在android學習的時候。一直想實現掛斷電話的功能,可是

java反射機制應用之動態代理

代理類 過多 size bject interface 並且 編譯期 代理 抽象 1.靜態代理類和動態代理類區別 靜態代理:要求被代理類和代理類同時實現相應的一套接口;通過代理類的對象調用重寫接口的方法時,實際上執行的是被代理類的同樣的 方法的調用。 動態代理:在程序運

java反射機制——獲取位元組碼對應類的函式

package cn.itcast.reflect.demo; import java.lang.reflect.Constructor; import java.lang.reflect.Method; //獲取類中的函式 public class ReflectDemo4 { public

java反射機制——獲取位元組碼對應類的欄位

package cn.itcast.reflect.demo; import java.lang.reflect.Field; public class ReflectDemo3 { public static void main(String[] args) throws ClassNot

Java核心機制反射機制的原理及應用方法

一、java的核心機制 java有兩種核心機制:java虛擬機器(JavaVirtual Machine)與垃圾收集機制(Garbage collection): 1、Java虛擬機器:是執行所有Java程式的抽象計算機,是Java語言的執行環境,在其上面執行Java程式碼編譯後的位元組碼程式,

Java反射機制的原理及在Android下的簡單應用

package crazypebble.reflectiontest;import java.lang.reflect.Constructor;import java.lang.reflect.Method;publicclass LoadMethod { /** * 在執行時載入指定的類,並呼

Java的類載入和Class.forName();java反射機制與原理

對於大部分人來說,第一次見到class.forName(String className)這句程式碼應該是在使用jdbc方式連線資料庫的時候。但這句程式碼本質上是什麼含義,做了什麼工作呢?本文將回答此問題。 理解Class.forName方法需要一些知識鋪墊,也就是

SpringBoot利用java反射機制,實現靈活讀取Excel表格的資料和匯出資料至Excel表格

如果直接把固定Excel表格模板中的資料匯入資料庫,直接將Excel中的資料讀取出來,再存入資料庫中即可,將資料匯出至固定的Excel模板方法類似。但是,有時候,開發製作的模板與客戶需要的往往有些許差別(欄位排版、欄位數量等)。為了實現匯入匯出的靈活性,將利用java的反射機