Java 的工廠方法及代理模式
工廠方法(FactoryMethod)
概述:定義一個用于創建對象的接口,讓子類決定實例化哪一個類。FactoryMethod使一個類的實例化延遲到其子類。
適用性:
- 當一個類不知道它所必須創建的對象的類的時候
- 當一個類希望由它的子類來指定它所創建的對象的時候
- 當類將創建對象的職責委托給多個幫助子類中的某一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候
示例可參考:http://blog.csdn.net/jason0539/article/details/23020989
總結:
FactoryMethod模式是設計模式中應用最為廣泛的模式,在面向對象的編程中,對象的創建工作非常簡單,對象的創建時機卻很重要。FactoryMethod解決的就是這個問題,它通過面向對象的手法,將所要創建的具體對象的創建工作延遲到了子類,從而提供了一種擴展的策略,較好的解決了這種緊耦合的關系。
代理模式(Proxy)
概述:為其他對象提供一種代理以控制對這個對象的訪問
示例:引用自http://blog.csdn.net/goskalrie/article/details/52458773
/**方式一:聚合式靜態代理* @author Goser (mailto:goskalrie@163.com)* @Since 2016年9月7日*/
//1.抽象主題接口
public interface Manager {void doSomething();
}
//2.真實主題類
public class Admin implements Manager {public void doSomething() {System.out.println("Admin do something.");}
}
//3.以聚合方式實現的代理主題
public class AdminPoly implements Manager{private Admin admin;public AdminPoly(Admin admin) {super();this.admin = admin;}public void doSomething() {System.out.println("Log:admin操作開始");admin.doSomething();System.out.println("Log:admin操作結束");}
}
//4.測試代碼Admin admin = new Admin();Manager m = new AdminPoly(admin);m.doSomething();
//方式二:繼承式靜態代理
//與上面的方式僅代理類和測試代碼不同
//1.代理類
public class AdminProxy extends Admin {@Overridepublic void doSomething() {System.out.println("Log:admin操作開始");super.doSomething();System.out.println("Log:admin操作開始");}
}
//2.測試代碼AdminProxy proxy = new AdminProxy();proxy.doSomething();
接口用法總結
- 通過接口可以實現不相關類的相同行為,而不需要考慮這些類之間的層次關系。
- 通過接口可以指明多個類需要實現的方法,一般用于定義對象的擴張功能。
- 接口主要用來定義規范。解除耦合關系
接口與抽象類的關系
No. | 區別點 | 抽象類 | 接口 |
---|---|---|---|
1 | 定義 | 包含一個抽象方法的類 | 抽象方法和全局常量的集合 |
2 | 組成 | 構造方法、抽象方法、普通方法、常量、變量 | 常量、抽象方法 |
3 | 使用 | 子類繼承抽象類(extends) | 子類實現接口(implements) |
4 | 關系 | 抽象類可以實現多個接口 | 接口不能繼承抽象類,但允許繼承多個接口 |
5 | 常見設計模式 | 模板設計 | 工廠設計、代理設計 |
6 | 對象 | 都通過對象的多態性產生實例化對象 | |
7 | 局限 | 抽象類有單繼承的局限 | 接口沒有此局限 |
8 | 實際 | 作為一個模板 | 是作為一個標準或是表示一種能力 |
9 | 選擇 | 如果抽象類和接口都可以使用的話,優先使用接口,因為避免單繼承的局限 | |
10 | 特殊 | 一個抽象類中可以包含多個接口,一個接口中可以包含多個抽象類 |