文章出處

抽象工廠模式,可以向客戶端提供一個接口,而客戶端不用指定具體的類型創建對象,卻能夠創建多個產品族(一類具有共性產品,如地域等)的對象。

下面直接上代碼。

1.蘋果需要實現水果的接口,而蘋果可以有北方的蘋果,也可以有南方的蘋果,所以也可以抽象成一個父類。

1 public interface Fruit {
2     public void Get();
3 }
4 
5 public abstract class Apple implements Fruit{
6     public abstract void Get();
7 }

 

2.南北方的蘋果均需要繼承這個父類,并實現父類的中的get方法。

 1 public class NorthApple extends Apple {
 2     public void Get() {
 3         System.out.println("北方蘋果");    
 4     }
 5 }
 6 
 7 public class SouthApple extends Apple {
 8     public void Get() {
 9         System.out.println("南方蘋果");
10     }
11 }

3.香蕉的做法與蘋果類似,抽象的父類繼承水果接口,假設南北方都有香蕉吧。

 1 public abstract class Banana implements Fruit {
 2     public abstract void Get() ;
 3 }
 4 
 5 public class SouthBanana extends Banana {
 6     public void Get() {
 7         System.out.println("南方香蕉");
 8     }
 9 }
10 
11 public class NorthBanana extends Banana {
12     public void Get() {
13         System.out.println("北方香蕉");
14     }
15 }

4.這樣創建的就都創建完成了。這時候我們考慮的問題,我們要想獲得蘋果的對象,或者獲得香蕉的對象,應該有這樣一個工廠去獲得。但是蘋果與香蕉是分南北的,所以我們需要南北工廠,這兩個工廠就是“族”的概念。

這時候可以抽象出水果工廠的接口,接口中的方法分別是獲取蘋果對象,香蕉對象。

1 public interface FruitFactory {
2     public Fruit getApple();
3     public Fruit getBanana();
4 }

5.南北工廠需要實現這個接口。

 1 public class SouthFruitFactory implements FruitFactory {
 2     public Fruit getApple() {
 3         return new SouthApple();
 4     }
 5     public Fruit getBanana() {
 6         return new SouthBanana();
 7     }
 8 }
 9 
10 public class NorthFruitFactory implements FruitFactory {
11     public Fruit getApple() {
12         return new NorthApple();
13     }
14     public Fruit getBanana() {
15         return new NorthBanana();
16     }
17 }

6.這樣兩個產品族就創建完成了,我們只需要在主客戶端中創建南方的工廠,就可以通過調用getApple()方法,得到南方蘋果的實例。其他亦然。

 1 public class MainClass {
 2     public static void main(String[] args) {
 3         FruitFactory factory=new NorthFruitFactory();   //獲取北方水果工廠的實例
 4         Fruit apple=factory.getApple();                  //北方蘋果
 5         Fruit banana=factory.getBanana();                //北方香蕉
 6         apple.Get();
 7         banana.Get();
 8         
 9         FruitFactory factory2=new SouthFruitFactory();   //獲取南方水果工廠的實例
10         Fruit apple2=factory2.getApple();               //南方蘋果
11         Fruit banana2=factory2.getBanana();              //南方香蕉
12         apple2.Get();
13         banana2.Get();    
14     }
15 }

個人理解,這個抽象工廠模式,在主客戶端調用的時候,只需要獲取相應的工廠,就可以得到想要的對象(不用指定具體要獲取的對象),實現相應的方法。這里與最開始抽象工廠的方法結合著理解就ok。

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()