Java設計模式之三(抽象工廠模式)

一、什麼是抽象工廠模式  
抽象工廠模式是所有形態的工廠模式中最爲抽象和最其一般性的。抽象工廠模式可以向客戶端提供一個接口,使得客戶端在不必指定產品的具體類型的情況下,能夠創建多個產品族的產品對象。
 
二、產品族和產品等級結構
 
三、模式中包含的角色及其職責
1.抽象工廠(Creator)角色 抽象工廠模式的核心,包含對多個產品結構的聲明,任何工廠類都必須實現這個接口。
2.具體工廠( Concrete  Creator)角色 具體工廠類是抽象工廠的一個實現,負責實例化某個產品族中的產品對象。
3.抽象(Product)角色 抽象模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。
4.具體產品(Concrete Product)角色 抽象模式所創建的具體實例對象
總結:抽象工廠中方法對應產品結構,具體工廠對應產品族。
 
代碼實現:
抽象Fruit(水果)類:
[java] 
package com.qianyan.product;  
public interface Fruit {  
    /** 
     * 採集 
     */  
    public void get();  
}  
抽象產品結構類(蘋果、香蕉):
[java]  
package com.qianyan.bean;  
import com.qianyan.product.Fruit;  
public abstract class Apple implements Fruit{  
    /** 
     * 採集 
     */  
    public abstract void get();  
}  
[java] 
package com.qianyan.bean;  
import com.qianyan.product.Fruit;  
public abstract class Banana implements Fruit{  
    /** 
     * 採集 
     */  
    public abstract void get();  
}  
抽象產品類的實現:產品族(北方蘋果、香蕉;南方蘋果、香蕉):
[java] 
package com.qianyan.bean.impl;  
import com.qianyan.bean.Apple;  
public class NorthApple extends Apple{  
    @Override  
    public void get() {  
        System.out.println("生產北方蘋果!");  
    }  
}  
[java] 
package com.qianyan.bean.impl;  
import com.qianyan.bean.Banana;  
public class NorthBanana extends Banana{  
    @Override  
    public void get() {  
        System.out.println("生產北方香蕉!");  
    }  
}  
[java] 
package com.qianyan.bean.impl;  
import com.qianyan.bean.Apple;  
public class SourthApple extends Apple{  
    @Override  
    public void get() {  
        System.out.println("生產南方蘋果!");  
    }  
}  
[java] 
package com.qianyan.bean.impl;  
import com.qianyan.bean.Banana;  
public class SourthBanana extends Banana{  
    @Override  
    public void get() {  
        System.out.println("生產南方香蕉!");  
    }  
}  
抽象工廠類(對應產品結構類):
[java]  
package com.qianyan.factory;  
import com.qianyan.product.Fruit;  
/** 
 * 抽象工廠類 
 * @author hadoop 
 * 
 */  
public interface FruitFactory {  
    //獲取蘋果  
    public Fruit getApple();  
    //獲取香蕉  
    public Fruit getBanana();  
}  
抽象工廠的實現類(對應產品族):
[java]  
package com.qianyan.factory.impl;  
import com.qianyan.bean.impl.NorthApple;  
import com.qianyan.bean.impl.NorthBanana;  
import com.qianyan.factory.FruitFactory;  
import com.qianyan.product.Fruit;  
public class NorthFactory implements FruitFactory{  
    @Override  
    public Fruit getApple() {  
        return new NorthApple();  
    }  
    @Override  
    public Fruit getBanana() {  
        return new NorthBanana();  
    }  
}  
[java]  
package com.qianyan.factory.impl;  
import com.qianyan.bean.impl.SourthApple;  
import com.qianyan.bean.impl.SourthBanana;  
import com.qianyan.factory.FruitFactory;  
import com.qianyan.product.Fruit;  
public class SourthFactory implements FruitFactory{  
    @Override  
    public Fruit getApple() {  
        return new SourthApple();  
    }  
    @Override  
    public Fruit getBanana() {  
        return new SourthBanana();  
    }  
}  
顧客類:
[java]  
package com.qianyan.user;  
import com.qianyan.factory.impl.NorthFactory;  
import com.qianyan.factory.impl.SourthFactory;  
import com.qianyan.product.Fruit;  
public class Customer {  
    public static void main(String[] args) throws Exception {  
        //獲得北方生產鏈  
        NorthFactory f1 = new NorthFactory();  
        //通過NorthFactory來獲取北方Apple實例對象  
        Fruit northApple = f1.getApple();  
        northApple.get();  
        //通過NorthFactory來獲取北方Banana實例對象  
        Fruit northBanana = f1.getBanana();  
        northBanana.get();  
        //獲得南方生產鏈  
        SourthFactory f2 = new SourthFactory();  
        //通過SourthFactory來獲取南方Apple實例對象  
        Fruit sourthApple = f2.getApple();  
        sourthApple.get();  
        //通過SourthFactory來獲取南方Banana實力對象  
        Fruit sourthBanana = f2.getBanana();  
        sourthBanana.get();  
    }  
}  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章