1. 程式人生 > >java -- 反射之利用反射完善工廠設計模式

java -- 反射之利用反射完善工廠設計模式

java的工廠設計模式源自於生活,大家先看一個例子,比較簡單,我剛開始瞭解工廠時看到的簡單例子。

interface IFruit {
	public void eat();
}
class Apple implements IFruit {
	@Override
	public void eat() {
		System.out.println("蘋果削皮吃");
	}

}
public class Factory {
	//此時為什麼使用static  ---->Factory產生一個例項化物件無意義!!
	public static IFruit getInstance(String className) {
		if("apple".equals(className)) {
			return new Apple();
		}else {
			return null;
		}
	}
}

原理就是,例項化類時原先本來是放在某個主方法中去例項化,但過於麻煩,所以建立一個工廠,讓工廠去管理是否建立某個類的例項化類。

最近再研究java的反射,突然發現,反射不是可以獲取指定的類的例項化物件麼,就使用反射琢磨著寫了個工廠類。

程式碼如下所示:

/**
 * 建立水果類介面
 * @author 76519
 *
 */
interface IFruit {
	public void eat();
}
class Cherry implements IFruit{
	@Override
	public void eat() {
		System.out.println("吃櫻桃....");
	}
}


class Factory{
	private Factory() {};//私有化構造方法   使其不能直接例項化
	
	//建立例項化工廠方式
	public static IFruit getIFruitInstance(String className) {
		IFruit fruit = null;
		try {
			//Object類  強制轉換為   IFruit
			fruit = (IFruit) Class.forName(className).newInstance();
			
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return fruit;
	}
}
/**
 * 一般模式下的工廠設計模式
 * @author 76519
 *
 */
public class TestDemo1 {
	public static void main(String[] args) {
		//new Factory();
		//多型模式  接收資料
		IFruit iFruit = Factory.getIFruitInstance("refelect.factory.Cherry");
		iFruit.eat();
		
	}
}

執行起來沒問題,但是好朋友給我提了個問題,你這是隻有IFruit的返回型別,如果我有很多種介面,介面下都有子類,如果像你這麼寫,我是不是要建立很多的工廠類和建立很多的判斷,然後判斷型別返回指定的例項化物件,不麻煩嗎??

作為小白的我不服輸,繼續琢磨一個更高替代的工廠類,既然有多個介面亦有多個子類,每個都有工廠,所以我們可以選擇泛型,看下面的程式碼。

/**
 * 建立水果類介面
 * 
 * @author 76519
 *
 */
interface IFruit {
	public void eat();
}

class Cherry implements IFruit {
	@Override
	public void eat() {
		System.out.println("吃櫻桃....");
	}
}

class Apple implements IFruit {
	@Override
	public void eat() {
		System.out.println("吃蘋果....");
	}
}

/**
 * 建立另外的一個 介面 (父類)
 * 
 * @author 76519
 *
 */
interface IMessage {
	public void print();
}

// 建立訊息父類的子類物件
class MessageImpl implements IMessage {
	@Override
	public void print() {
		System.out.println("列印資訊.....");
	}
}

class Factory {
	// 私有化構造方法 使其不能  例項化
	private Factory() {}

	/**
	 * 建立例項化      工廠方式   ----   泛型模式    
	 * @param className   接收的類名稱(全路徑)
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getInstance(String className) {
		T t = null;
		try {
			t = (T) Class.forName(className).newInstance();
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return t;
	}
}

/**
 * 一般模式下的工廠設計模式
 * @author 76519
 *
 */
public class TestDemo2 {
	public static void main(String[] args) {
		// 多型模式 接收資料
		IFruit iFruit = Factory.getInstance("refelect.factory.wonderfull.Cherry");
		iFruit.eat();
		
		// 多型模式   接收訊息類
		IMessage iMessage = Factory.getInstance("refelect.factory.wonderfull.MessageImpl");
		iMessage.print();
	}
}

輸出資訊:

吃櫻桃....
列印資訊.....

兩種介面都是呼叫同一個工廠類,都可以獲取其對應的例項化類,並呼叫其中的方法。

小夥伴們,是不是很好玩呢,大家如有更好的建議,希望能夠提出來,我們共同學習!

相關推薦

java -- 反射利用反射完善工廠設計模式

java的工廠設計模式源自於生活,大家先看一個例子,比較簡單,我剛開始瞭解工廠時看到的簡單例子。 interface IFruit { public void eat(); } class Apple implements IFruit { @Override pub

設計模式禪》-3.工廠設計模式

工廠設計模式 定義: 定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類 通用程式碼 //抽象產品類 (也可以是功能介面) public abstract class Product { //產品的公共方法 public voi

Java多執行緒-56-簡單工廠設計模式

關於設計模式,前面我們學習了單例設計模式,這篇再來學習一個工廠方法模式,在介紹工廠方法模式之前,我們來看一個簡單工廠模式。工廠模式的最大優點就是客戶端不需要再建立物件,工廠類中就幫你提前建立好了,直接通過工廠類名點方法呼叫就好。簡單工廠模式又叫靜態方法工廠模式,它定義了一個具體的工廠類來建立一些

Java設計模式工廠設計模式

一、簡單工廠 /* * 簡單工廠(靜態工廠) * */ /* * 抽象產品類 * */ interface CarProduct{ /* * 抽象產品類的抽象方法show()。 * */ public void show(); } /* * 具體產品類 * *

Java筆記:[反射篇] 利用反射,獲取類中的私有內部類物件,並呼叫該物件的方法

public void smoothScrollBy(int dx, int dy, int duration) { try { Class<?> c = null; try { c = Class

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

工廠模式 工廠模式(Factory Pattern)是java中最常見的設計模式之一,該型別屬於建立型設計模式,它提供了一種建立物件的最佳方式。在工廠模式中,我們建立物件時不會對客戶端暴露建立邏輯,並且是通過使用一個共同的介面指向新建立的物件。 1.簡介 意圖:定義一個建立物件的介面,讓

java反射陣列反射

1、陣列反射的特點 (1)具有相同維數和元素型別的陣列屬於同一個型別,即具有相同的Class例項物件 (2)代表陣列的Class例項物件的getSuperClass()方法返回的父類為Objec

java工廠設計模式初步

void system sys pub nts 實例化 eat public oid 沒有利用反射機制定義的簡單工廠類 interface Fruit{ public void eat(); } class Apple implements Fruit{

php設計模式工廠設計模式

方便 都是 避免 支付寶 高級 acl mage 概念 actor 概念: 工廠設計模式提供獲取某個對象的新實例的一個接口,同時使調用代碼避免確定實際實例化基類步驟。 很多高級模式都是依賴於工廠模式。 好處: PHP中能夠創建基於變量內容的類的

java面試題----jdbc中使用的設計模式(橋接模式

connect @override 操作 tro orb his order ng- return 1.JDBC(JavaDatabase Connectivity) JDBC是以統一方式訪問數據庫的API. 它提供了獨立於平臺的數據庫訪問,也就是說,有了JDB

Go語言反射反射

文章目錄 1 概述 2 值反射物件 3 修改值 4 修改結構體欄位值 1 概述 反射不僅可以獲取值的型別資訊,還可操作變數的值。使用 reflect.Value 型別操作變數的值。 2 值反射

Go語言反射型別反射

文章目錄 1 概述 2 獲取型別 3 獲取基礎型別(類別) 4 指標引用的元素型別 5 結構體資訊 6 結構體標籤 1 概述 類似於 Java,Go 語言也支援反射。支援反射的語言可以在

java設計模式----工廠設計模式

目錄     1.面向物件設計的基本原則   2.簡單工廠模式   3.工廠方法模式   4.抽象工廠模式     工廠設計模式的核心本質:   1、例項化物件,用工廠方法代替new操作。   2、將選擇實現類、建立物件統一管理和控制。從而將呼叫者跟我們的實現類解

Java——多執行緒基本使用(四) 執行緒組和執行緒池的使用,工廠設計模式的使用

1.執行緒組的概述和使用 Java中使用ThreadGroup來表示執行緒組,它可以對一批執行緒進行分類管理,Java允許程式直接對執行緒組進行控制。            &n

設計模式禪》-4.工廠方法模式的擴充套件

1.靜態工廠模式(簡單工廠模式) 其實就是去掉了抽象工廠類,然後定義一個工廠類的建立方法設定為靜態方法簡化了工廠類的建立   public class Factory{ public static <T extends Product> T create(C

Java工廠設計模式

工廠模式是Java中最常用的設計模式之一。 這種型別的設計模式屬於建立模式,因為此模式提供了建立物件的最佳方法之一。 在工廠模式中,我們沒有建立邏輯暴露給客戶端建立物件,並使用一個通用的介面引用新建立的物件。 例項實現方法: 你會建立一個專門生產Sample例項的工

python面向物件抽象工廠設計模式

class truck: def use(self): return "拉貨" def __str__(self): return "大卡車"class minicar: def use(self): return "帶妹兜風" def __s

java 簡單工廠 設計模式

     簡單工廠模式是由一個物件決定創建出哪一種產品的例項。簡單工廠模式是工廠模式家族中最簡單隻用的模式。 檢視下面的程式碼有何不妥之處 我先定義一個生產的介面, 然後我在用一個手機類去實現這個介面,

反射暴力反射

AccessibleObject 類是 Field、Method 和 Constructor 物件的基類。它提供了將反射的物件標記為在使用時取消預設 Java 語言訪問控制檢查的能力。對於公共成員、預設(打包)訪問成員、受保護成員和私有成員,在分別使用 Field、Method 或 Constructor