JAVA设计模式之抽象工厂模式和代理模式
目錄
一.抽象工廠模式
1.1.模式的定義與特點(diǎn)
1.2.模式的結(jié)構(gòu)
二.代理模式
2.1代理模式的定義與特點(diǎn)
2.2代理模式的結(jié)構(gòu)與實(shí)現(xiàn)
一.抽象工廠模式
1.1.模式的定義與特點(diǎn)
抽象工廠(AbstractFactory)模式的定義:是一種為訪問(wèn)類(lèi)提供一個(gè)創(chuàng)建一組相關(guān)或相互依賴(lài)對(duì)象的接口,且訪問(wèn)類(lèi)無(wú)須指定所要產(chǎn)品的具體類(lèi)就能得到同族的不同等級(jí)的產(chǎn)品的模式結(jié)構(gòu)。
使用抽象工廠模式一般要滿(mǎn)足以下條件。
-
可以在類(lèi)的內(nèi)部對(duì)產(chǎn)品族中相關(guān)聯(lián)的多等級(jí)產(chǎn)品共同管理,而不必專(zhuān)門(mén)引入多個(gè)新的類(lèi)來(lái)進(jìn)行管理。
-
當(dāng)需要產(chǎn)品族時(shí),抽象工廠可以保證客戶(hù)端始終只使用同一個(gè)產(chǎn)品的產(chǎn)品組。
-
抽象工廠增強(qiáng)了程序的可擴(kuò)展性,當(dāng)增加一個(gè)新的產(chǎn)品族時(shí),不需要修改原代碼,滿(mǎn)足開(kāi)閉原則。
其缺點(diǎn)是:當(dāng)產(chǎn)品族中需要增加一個(gè)新的產(chǎn)品時(shí),所有的工廠類(lèi)都需要進(jìn)行修改。增加了系統(tǒng)的抽象性和理解難度。
1.2.模式的結(jié)構(gòu)
抽象工廠模式的主要角色如下。
抽象工廠(Abstract Factory):提供了創(chuàng)建產(chǎn)品的接口,它包含多個(gè)創(chuàng)建產(chǎn)品的方法 newProduct(),可以創(chuàng)建多個(gè)不同等級(jí)的產(chǎn)品。
具體工廠(Concrete Factory):主要是實(shí)現(xiàn)抽象工廠中的多個(gè)抽象方法,完成具體產(chǎn)品的創(chuàng)建。
抽象產(chǎn)品(Product):定義了產(chǎn)品的規(guī)范,描述了產(chǎn)品的主要特性和功能,抽象工廠模式有多個(gè)抽象產(chǎn)品。
具體產(chǎn)品(ConcreteProduct):實(shí)現(xiàn)了抽象產(chǎn)品角色所定義的接口,由具體工廠來(lái)創(chuàng)建,它同具體工廠之間是多對(duì)一的關(guān)系。
抽象工廠模式的主要角色如下。
二.代理模式
在有些情況下,一個(gè)客戶(hù)不能或者不想直接訪問(wèn)另一個(gè)對(duì)象,這時(shí)需要找一個(gè)中介幫忙完成某項(xiàng)任務(wù),這個(gè)中介就是代理對(duì)象。例如,購(gòu)買(mǎi)火車(chē)票不一定要去火車(chē)站買(mǎi),可以通過(guò) 12306 網(wǎng)站或者去火車(chē)票代售點(diǎn)買(mǎi)。又如找女朋友、找保姆、找工作等都可以通過(guò)找中介完成。
在軟件設(shè)計(jì)中,使用代理模式的例子也很多,例如,要訪問(wèn)的遠(yuǎn)程對(duì)象比較大(如視頻或大圖像等),其下載要花很多時(shí)間。還有因?yàn)榘踩蛐枰帘慰蛻?hù)端直接訪問(wèn)真實(shí)對(duì)象,如某單位的內(nèi)部數(shù)據(jù)庫(kù)等。
2.1代理模式的定義與特點(diǎn)
代理模式的定義:由于某些原因需要給某對(duì)象提供一個(gè)代理以控制對(duì)該對(duì)象的訪問(wèn)。這時(shí),訪問(wèn)對(duì)象不適合或者不能直接引用目標(biāo)對(duì)象,代理對(duì)象作為訪問(wèn)對(duì)象和目標(biāo)對(duì)象之間的中介。 代理模式的主要優(yōu)點(diǎn)有:
-
代理模式會(huì)造成系統(tǒng)設(shè)計(jì)中類(lèi)的數(shù)量增加
-
在客戶(hù)端和目標(biāo)對(duì)象之間增加一個(gè)代理對(duì)象,會(huì)造成請(qǐng)求處理速度變慢;
-
增加了系統(tǒng)的復(fù)雜度;
那么如何解決以上提到的缺點(diǎn)呢?答案是可以使用動(dòng)態(tài)代理方式
2.2代理模式的結(jié)構(gòu)與實(shí)現(xiàn)
代理模式的結(jié)構(gòu)比較簡(jiǎn)單,主要是通過(guò)定義一個(gè)繼承抽象主題的代理來(lái)包含真實(shí)主題,從而實(shí)現(xiàn)對(duì)真實(shí)主題的訪問(wèn),下面來(lái)分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。 代理模式的主要角色如下。
圖1 代理模式的結(jié)構(gòu)圖
在代碼中,一般代理會(huì)被理解為代碼增強(qiáng),實(shí)際上就是在原代碼邏輯前后增加一些代碼邏輯,而使調(diào)用者無(wú)感知。
-
靜態(tài):由程序員創(chuàng)建代理類(lèi)或特定工具自動(dòng)生成源代碼再對(duì)其編譯,在程序運(yùn)行前代理類(lèi)的 .class 文件就已經(jīng)存在了。
-
動(dòng)態(tài):在程序運(yùn)行時(shí),運(yùn)用反射機(jī)制動(dòng)態(tài)創(chuàng)建而成
動(dòng)態(tài)代理:
public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Object target;public void setTarget(Object target) {this.target = target;}//生成得到代理類(lèi)public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this );}//處理代理實(shí)例,并返回結(jié)果@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = method.invoke(target, args);return result;}}//測(cè)試類(lèi)public class Test {public static void main(String[] args) {//真實(shí)角色Host h=new Host();//代理角色ProxyInvocationHandler p=new ProxyInvocationHandler();//通過(guò)調(diào)用程序處理角色來(lái)處理我們要調(diào)用的接口對(duì)象p.setTarget(h);//設(shè)置代理類(lèi)Rent o =(Rent) p.getProxy();//動(dòng)態(tài)生成的代理類(lèi)o.rent();} } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的JAVA设计模式之抽象工厂模式和代理模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: zcmu-1958
- 下一篇: 23种设计模式及OOP7大原则