Java反射机制在工厂模式中的应用
在本篇文章中就不詳細(xì)介紹工廠模式,主要介紹一下反射在工廠模式中的使用,讓讀者對(duì)反射機(jī)制帶來(lái)的好處有更深的認(rèn)識(shí)。
首先看一下簡(jiǎn)單工廠模式
簡(jiǎn)單工廠模式(simple factory)是類(lèi)的創(chuàng)建模式,又叫靜態(tài)工廠方法(static factory method)模式。
簡(jiǎn)單工廠模式就是由一個(gè)工廠類(lèi)根據(jù)傳入的參數(shù)決定創(chuàng)建哪一種的產(chǎn)品類(lèi)。
簡(jiǎn)單工廠模式實(shí)例:
//動(dòng)物接口 interface Animal{public void speak(); } //人實(shí)現(xiàn)類(lèi) class Man implements Animal{@Overridepublic void speak() {System.out.println("我是人我會(huì)說(shuō)話:哈哈哈!!!");} } //狗實(shí)現(xiàn)類(lèi) class Dog implements Animal{@Overridepublic void speak() {System.out.println("我是小狗不會(huì)說(shuō)話:汪汪汪!!!");} } //工廠類(lèi) class Factory{public Animal getAnimal(String name){if("man".equals(name)){return new Man();}else{return new Dog();}} } //測(cè)試類(lèi) public class GeneralFactory {public static void main(String[] args){Factory factory = new Factory();Animal an = factory.getAnimal("dog");an.speak();} }輸出結(jié)果: 我是小狗不會(huì)說(shuō)話:汪汪汪!!!上面代碼中,定義了一個(gè)動(dòng)物(Animal)接口,接著分別定義了人(Man)和狗(Dog)實(shí)現(xiàn)類(lèi),實(shí)現(xiàn)了speak()說(shuō)話的方法。
如果我們現(xiàn)在不用工廠模式,在調(diào)用人的說(shuō)話方法時(shí)需要new一個(gè)人(Man)的對(duì)象,使用狗的說(shuō)話方式時(shí),需要new一個(gè)狗(Dog)類(lèi)的對(duì)象。
這樣在new對(duì)象時(shí),就需要考慮到接口和子類(lèi)的實(shí)現(xiàn)方式,增加了代碼的耦合度。在代碼中使用new操作其實(shí)也是一種硬編碼方式。
使用簡(jiǎn)單工廠模式解決這個(gè)問(wèn)題(上面的代碼),封裝一個(gè)工廠類(lèi),把new對(duì)象的操作放在這個(gè)工廠類(lèi)中,這樣我們?cè)谡{(diào)用子類(lèi)里面的方法時(shí),并不需要考慮子類(lèi)的實(shí)現(xiàn)方式,只需要調(diào)用工廠類(lèi),讓工廠類(lèi)給我們實(shí)現(xiàn)new對(duì)象的過(guò)程,使子類(lèi)與外界操作沒(méi)有聯(lián)系,降低代碼耦合性。
大家應(yīng)該也發(fā)現(xiàn)了簡(jiǎn)單工廠模式有個(gè)很大的弊端,就是現(xiàn)在要實(shí)現(xiàn)很多動(dòng)物的speak()方法,那么工廠類(lèi)里面就要不斷的添加new對(duì)象的操作,修改里面的代碼,很顯然這樣并沒(méi)有達(dá)到我們理想的要求。可以使用Java的反射機(jī)制來(lái)解決。
采用反射機(jī)制的簡(jiǎn)單工廠模式實(shí)例:
package com.qcjy.factory;//動(dòng)物接口 interface Animal1{public void speak(); } //人實(shí)現(xiàn)類(lèi) class Man1 implements Animal{@Overridepublic void speak() {System.out.println("我是人我會(huì)說(shuō)話:哈哈哈!!!");} } //狗實(shí)現(xiàn)類(lèi) class Dog1 implements Animal{@Overridepublic void speak() {System.out.println("我是小狗不會(huì)說(shuō)話:汪汪汪!!!");} } //工廠類(lèi) class Factory1{public Object getAnimal(String className) throws Exception{Class<?> cls = Class.forName(className);Object obj = cls.newInstance();return obj;} } //測(cè)試類(lèi) 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();} }輸出結(jié)果: 我是人我會(huì)說(shuō)話:哈哈哈!!!采用反射后,無(wú)論添加多少個(gè)子類(lèi),工廠類(lèi)中的代碼都不需要修改,只需要在操作的時(shí)候傳入子類(lèi)的類(lèi)路徑(包.類(lèi))就可以了,實(shí)現(xiàn)了各個(gè)業(yè)務(wù)邏輯之間的完全分離,代碼耦合性進(jìn)一步降低,很好的解決了上面的問(wèn)題。看到這里,大家應(yīng)該體會(huì)到了反射機(jī)制給我?guī)?lái)的方便了吧,哈哈!
PS:工廠模式分為簡(jiǎn)單工廠模式、工廠方法模式、抽象工廠模式。簡(jiǎn)單工廠模式是對(duì)代碼的自然封裝,比較容易理解,幾乎每個(gè)人都會(huì)用的上。真正算的上設(shè)計(jì)模式的是抽象工廠模式,但是大部分人都很少能用上抽象工廠模式。Spring框架中的IOC用到的就是簡(jiǎn)單工廠模式。
總結(jié)
以上是生活随笔為你收集整理的Java反射机制在工厂模式中的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通达信l2行情接口怎么用?
- 下一篇: 设计模式-工厂方法的应用场景及Java中