首先說下什麼是抽象工廠模式:
抽象工廠模式(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!