《設計模式——java版》(三)
阿新 • • 發佈:2018-12-21
三、抽象工廠模式
1.為建立一組相關或相互依賴的物件提供一個介面,而且無須指定它們的具體類。抽象工廠模式是工廠方法模式的升級版本。在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的物件是一種非常好的解決方式。
2.抽象工廠模式與工廠方法模式類似,也是有四個不同的角色:
(1)抽象工廠角色:任何建立物件的工廠類必須實現這個介面 (2)具體工廠角色:該角色實現了抽象工廠介面,含有選擇合適的產品物件的邏輯,並且受到應用程式的呼叫以建立產品物件 (3)抽象產品角色:該角色負責定義產品的共性,實現對產品最抽象的定義 (4)具體產品角色:實現抽象產品角色所宣告的介面,抽象工廠模式所建立的任何產品物件都是某個具體產品角色的例項3.抽象工廠模式的優點
4.抽象工廠模式的適用場景
5.抽象工廠模式的例項
抽象工廠public interface AbstractFactory {
//建立產品A
public ProductA factoryA();
//建立產品B
public ProductB factoryB();
}
具體工廠1
具體工廠2public class ConcreteFactory1 implements AbstractFactory{ public ProductA factoryA(){ return new ProductA1(); } public ProductB factoryB(){ return new ProductB1(); } }
public class ConcreteFactory2 implements AbstractFactory {
public ProductA factoryA(){
return new ProductA2();
}
public ProductB factoryB(){
return new ProductB2();
}
}
抽象產品A
public interface ProductA {
public void method1();
public void method2();
}
具體產品A1
public class ProductA1 implements ProductA{
public void method1(){
System.out.println("等級為1的產品A的實現方法");
}
public void method2(){
}
}
具體產品A2
public class ProductA2 implements ProductA{
public void method1(){
System.out.println("等級為2的產品A的實現方法");
}
public void method2(){
}
}
抽象產品B
public interface ProductB {
public void method1();
public void method2();
}
具體產品B1
public class ProductB1 implements ProductB {
public void method1(){
System.out.println("等級為1的產品B的實現方法");
}
public void method2(){
}
}
具體產品B2
public class ProductB2 implements ProductB{
public void method1(){
System.out.println("等級為2的產品B的實現方法");
}
public void method2(){
}
}
測試
public class ClientDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//定義兩個工廠
AbstractFactory factory1 = new ConcreteFactory1();
AbstractFactory factory2 = new ConcreteFactory2();
//生產等級為1的產品A
ProductA a1 = new ProductA1();
ProductA a2 = new ProductA2();
ProductB b1 = new ProductB1();
ProductB b2 = new ProductB2();
a1.method1();
a2.method1();
b1.method1();
b2.method1();
}
}
執行結果:
6.寫到這裡,必須要總結一下。寫下整個例項的過程真的是麻煩,程式碼量不小!!
四、代理模式
1.為其他物件提供一種代理以控制對這個物件的訪問
2.代理模式提供以下3個角色:
(1)抽象主題角色:該角色是代理主題和真實主題的介面,以便在任何可以使用真實主題的地方都可以使用代理主題 (2)代理主題角色:該角色負責控制對真實主題的引用 (3)真實主題角色:是業務邏輯的具體執行者3.代理模式的種類
(1)遠端代理:為一個位於不同的地址空間的物件提供一個區域性代表物件。找哥哥不同的地址空間可以是在本機器中,也可以在另一臺機器中 (2)虛擬代理:有時需要建立一些消耗較多資源的物件,可以首先建立代理物件,而將真實物件的建立延遲。 (3)保護代理:控制對一個物件的訪問,如果需要,可以給不同的使用者提供不同級別的使用許可權 (4)快取代理:為某一個目標操作的結果提供臨時的儲存空間,以便多個客戶端可以共享這些結果 (5)同步代理:使幾個使用者能夠同時使用一個物件而沒有衝突 (6)智慧引用代理:當一個物件被引用時,提供一些額外的操作4.代理模式的優點
(1)職責清晰 (2)高擴充套件性 (3)智慧化5.代理模式的適用場景
Java RMI 的遠端呼叫就是一種代理模式的應用;AOP也可以通過代理模式實現。6.代理模式程式碼
Subject.javapublic interface Subject {
public void request();
}
RealSubject.java
public class RealSubject implements Subject {
public void request(){
}
}
ProxySubject.java
public class ProxySubject implements Subject {
private Subject subject;
public ProxySubject(Subject subject){
this.subject = subject;
}
public void request(){
this.beforeRequest();
subject.request();
this.afterRequest();
}
private void beforeRequest(){
}
private void afterRequest(){
}
}