抽象工廠模式AbstractFactoryPattern

首先說下什麼是抽象工廠模式:
抽象工廠模式(Abstract Factory Pattern)是圍繞一個超級工廠創建其他工廠。該超級工廠又稱爲其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。
在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。
然後說下抽象工廠模式的應用場景:
1、QQ 換皮膚,一整套一起換。
2、生成不同操作系統的程序。
優點:當一個產品族中的多個對象被設計成一起工作時,它能保證客戶端始終只使用同一個產品族中的對象。
缺點:代碼耦合度太高,不易於擴展.
抽象工廠模式的理念就是建立一個抽象工廠,然後其他的工廠都繼承這個工廠.
邏輯大概是:
訂單通過入口傳遞到工廠控制處,控制處根據不同的工廠需求來創建不同的工廠,然後再根據不同的的貨物訂單由對應的工廠調用對應的生產線,生產訂單所需產品.
理念大致如上文所述,那麼接下來簡單說下抽象工廠模式的幾個文件,本博文所涉及的文件一共11個,其結構如下圖所示:
這裏寫圖片描述
具體代碼如下圖所示:
接口:

    package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*/**
* @author zhangrui
* @Description 食物接口,可以類比食物生產許可證
* @Date 10:31 2018/4/20
* @Param
* @returu
**/
public interface Food {
    public void creat();
}
package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*/**
* @author zhangrui
* @Description 包裝接口,類似包裝生產許可證
* @Date 16:52 2018/4/20
* @Param
* @returu
**/
public interface Packaging {
    public void givePackage();
}

對應的實現類:

package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName DumplingProductLine
*@Description TODO 餃子類(類比生產線) 這條生產線具有生產食物的資質 根據自身需求專門用來生產--餃子
*@Author zhangrui
*@Date 10:31 10:31
*@Version 
* */
public class DumplingProductLine implements Food {
    @Override
    public void creat() {
        ceretDumpling();
    }

    private void ceretDumpling() {
        System.out.println("工廠生產了餃子(I'm a fresh Dumpling)");;
    }
}
package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName NoodleProductLine
*@Description TODO 麪條類(類比生產線) 這條生產線具有生產食物的資質 根據自身需求專門用來生產--麪條
*@Author zhangrui
*@Date 10:30 10:30
*@Version 
* */
public class NoodleProductLine implements Food {
    @Override
    public void creat() {
        creatNoodle();
    }
    private void creatNoodle() {
        System.out.println( "工廠生產了麪條(I'm a noodle)");
    }
}
package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName PaperProductLine
*@Description TODO
*@Author zhangrui
*@Date 15:16 15:16
*@Version 
* */
public class PaperProductLine implements Packaging {
    @Override
    public void givePackage() {
        System.out.println( "生產紙包裝");
    }
}
package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName PlasticProductLine
*@Description TODO
*@Author zhangrui
*@Date 15:13 15:13
*@Version 
* */
public class PlasticProductLine implements Packaging {
    @Override
    public void givePackage() {
        System.out.println("生產塑料包裝");
    }
}

創建抽象工廠:

package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName FactoryPatternDemo
*@Description TODO
*@Author zhangrui
*@Date 11:00 11:00
*@Version 
* */
public abstract class AbstractFactory {
    abstract Food creatFood(String... foodOrder);
    abstract Packaging creatPackage(String... packageOrder);
}

創建繼承了抽象工廠的具體工廠:

package com.example.abstractFactoryPattern;



/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName FoodFactory
*@Description TODO
*@Author zhangrui
*@Date 15:25 15:25
*@Version 
* */
public class FoodFactory extends AbstractFactory {
    NoodleProductLine noodleProductLine = new NoodleProductLine();
    DumplingProductLine dumplingProductLine = new DumplingProductLine();
    @Override
    Food creatFood(String... foodOrder) {
        if (foodOrder==null){
            return null;
        }
        String msg = "";
        //對進貨商的需求進行判斷
        //如果需要的是
        for (int i = 0;i < foodOrder.length;i++ ){
            if (foodOrder[i].equals("noodle")){
                //調用麪條生產線生產麪條
                noodleProductLine.creat();
               // return noodleProductLine;
            }else if (foodOrder[i].equals("dumpling")){
                //調用餃子生產線生產餃子
                dumplingProductLine.creat();
               //return dumplingProductLine;
            }else {
                //工廠沒有對應的生產線,那就沒辦法調用生產線生產食物,所以返回提示信息
                System.out.println("訂單中的食物"+foodOrder[i]+"我們廠沒辦法成產,找別家看看吧");
            }
        }
        return null;
    }

    @Override
    Packaging creatPackage(String... packageOrder) {
        return null;
    }
}
package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName PackageFactory
*@Description TODO
*@Author zhangrui
*@Date 15:26 15:26
*@Version 
* */
public class PackageFactory extends AbstractFactory {
    PaperProductLine paperProductLine = new PaperProductLine();
    PlasticProductLine plasticProductLine = new PlasticProductLine();
    @Override
    Food creatFood(String... foodOrder) {
        return null;
    }

    @Override
    Packaging creatPackage(String... packageOrder) {
        if (packageOrder==null){
            return null;
        }
        //對進貨商的需求進行判斷
        //如果需要的是
        for (int i = 0;i < packageOrder.length;i++ ){
            if (packageOrder[i].equalsIgnoreCase("paper")){
                //調用紙包裝生產線生產紙包裝
                paperProductLine.givePackage();
            }else if (packageOrder[i].equalsIgnoreCase("plastic")){
                //調用塑料包裝生產線生產塑料包裝
                 plasticProductLine.givePackage();
            }else {
                //工廠沒有對應的生產線,那就沒辦法調用生產線生產包裝,所以返回提示信息
                System.out.println("訂單中的包裝"+packageOrder[i]+"我們廠沒辦法成產,找別家看看吧");;
            }
        }
        return null;
    }
}

創建工廠調度器:

package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName FactoryProducer
*@Description TODO
*@Author zhangrui
*@Date 15:40 15:40
*@Version 
* */
public class FactoryProducer {
    public static AbstractFactory getFactory(String... choice){
        for (int i = 0;i< choice.length;i++){
            if(choice[i].equalsIgnoreCase("food")){
                return new FoodFactory();
            } else if(choice[i].equalsIgnoreCase("package")){
                return new PackageFactory();
            }
        }
        return null;
    }
}

創建程序入口,自定義需要的工廠類型以及產品:

package com.example.abstractFactoryPattern;

/**
 * Created by zhangrui on 2018/4/20.
 */
/*
* @ClassName AbstractFactoryPatternDemo
*@Description TODO
*@Author zhangrui
*@Date 15:41 15:41
*@Version 
* */
public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        String[] orderA = {"food"};
        String[] foodOrder = {"noodle","dumpling"};
        //獲取食品工廠
        AbstractFactory abstractFactory = FactoryProducer.getFactory(orderA);
        abstractFactory.creatFood(foodOrder);
        String[] orderB = {"package"};
        String[] packageOrder = {"paper","plastic"};
        abstractFactory = FactoryProducer.getFactory(orderB);
        abstractFactory.creatPackage(packageOrder);
    }
}

以上就是本博文的全部代碼,代碼運行效果如下圖所示:
這裏寫圖片描述
所有的代碼都推送到了博主的GitHub,有需要的小夥伴可以去下載查看,
點擊此處即可跳轉
注:本博文爲博主記錄所寫,若有不對之處歡迎指正.
Over!

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