1. 程式人生 > >《設計模式——java版》(三)

《設計模式——java版》(三)

三、抽象工廠模式

        1.為建立一組相關或相互依賴的物件提供一個介面,而且無須指定它們的具體類。抽象工廠模式是工廠方法模式的升級版本。在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的物件是一種非常好的解決方式。

        2.抽象工廠模式與工廠方法模式類似,也是有四個不同的角色:

                (1)抽象工廠角色:任何建立物件的工廠類必須實現這個介面                 (2)具體工廠角色:該角色實現了抽象工廠介面,含有選擇合適的產品物件的邏輯,並且受到應用程式的呼叫以建立產品物件                 (3)抽象產品角色:該角色負責定義產品的共性,實現對產品最抽象的定義                 (4)具體產品角色:實現抽象產品角色所宣告的介面,抽象工廠模式所建立的任何產品物件都是某個具體產品角色的例項

        3.抽象工廠模式的優點

                  抽象工廠模式是工廠方法模式的進一步抽象,針對的是一族產品。如果產品族中只有一種產品,則抽象工廠模式就退化為工廠方法模式。除了工廠方法模式外,抽象工廠           模式還具有下列優點:                 (1)產品族內的約束為非公開狀態,在不同的工廠中,各種產品可能具有不同的相互依賴關係,這些依賴關係由工廠封裝在其內部,對於工廠的使用者是不可見的                 (2)生產線的擴充套件非常容易,如果要針對同一產品族建立新的生產線,只需要實現產品族中所有產品介面並建立新的工廠類即可。            缺點:                 (1)產品族本身的擴充套件非常困難,如果需要在產品族中增加一個新的產品型別。則需要修改多個介面,並且會影響已有的產品類。

        4.抽象工廠模式的適用場景

                當一個物件族都具有相同的約束,則可以使用抽象工廠模式

        5.抽象工廠模式的例項

抽象工廠
public interface AbstractFactory {
	//建立產品A
	public ProductA factoryA();
	//建立產品B
	public ProductB factoryB();
}

具體工廠1
public class ConcreteFactory1 implements AbstractFactory{
	public ProductA factoryA(){
		return new ProductA1();
	}
	public ProductB factoryB(){
		return new ProductB1();
	}
}
具體工廠2
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.java
public 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(){
		
	}
}