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