Java設計模式之《抽象工廠模式》及使用場景


原創文章,轉載請標注出處:Java設計模式之《抽象工廠模式》及使用場景

一、概述

抽象工廠模式是對工廠方法模式的再升級,但是二者面對的場景稍顯差別。

工廠方法模式面對的目標一般都是單類的,就比如《ava設計模式之《工廠方法模式》及使用場景》中所舉的例子,目標就是桌子這一類商品。

如果是這樣的呢:生產的是桌椅組合,目標的一套商品,每一套商品中的每類商品的種類的不同的,不同的組合形成不同的套裝。

這種情況下,就需要使用抽象工廠模式

二、實例

我們還以家具為例:

桌子接口:Desk

/**
 * 桌子接口
 */
public interface Desk {
    String getType();
}

木質桌子:WoodenDesk

/**
 * 木質桌子
 */
public class WoodenDesk implements Desk {
    private String type = "木質桌";
    @Override
    public String getType() {
        return type;
    }
}

塑料桌子:PlasticDesk

/**
 * 塑料桌
 */
public class PlasticDesk implements Desk {
    private String type = "塑料桌";
    @Override
    public String getType() {
        return type;
    }
}

椅子接口:Chair

/**
 * 椅子接口
 */
public interface Chair {
    String getType();
}

木質椅子:WoodenChair

/**
 * 木質椅
 */
public class WoodenChair implements Chair {
    private String type = "木質椅";
    @Override
    public String getType() {
        return type;
    }
}

塑料椅:PlasticChair

/**
 * 塑料椅
 */
public class PlasticChair implements Chair {
    private String type = "塑料椅";
    @Override
    public String getType() {
        return type;
    }
}

家具工廠接口:FurnitureFactory

/**
 * 家具工廠
 */
public interface FurnitureFactory {
    Desk createDesk();
    Chair createChair();
}

木質家具工廠:WoodenFurnitureFactory

/**
 * 木質家具工廠
 */
public class WoodenFurnitureFactory implements FurnitureFactory {
    @Override
    public Desk createDesk() {
        return new WoodenDesk();
    }

    @Override
    public Chair createChair() {
        return new WoodenChair();
    }
}

塑料家具工廠:PlasticFurnitureFactory

/**
 * 塑料家具工廠
 */
public class PlasticFurnitureFactory implements FurnitureFactory {
    @Override
    public Desk createDesk() {
        return new PlasticDesk();
    }

    @Override
    public Chair createChair() {
        return new PlasticChair();
    }
}

測試類:Clienter

/**
 * 測試類
 */
public class Clienter {
    public static void main(String[] args) {
        FurnitureFactory factory = new PlasticFurnitureFactory();
        Desk desk = factory.createDesk();
        Chair chair = factory.createChair();
        System.out.println(desk.getType());
        System.out.println(chair.getType());
    }
}

執行結果:

塑料桌
塑料椅

三、解析

通過上面的例子,對比Java設計模式之《工廠方法模式》及使用場景中工廠方法模式的例子,可以看出二者場景的不同之處,抽象工廠模式面對的是一個組合體,如果將這一點排除的話,其他方面看起來,二者還是相似的。

這里在目標每添加一種組合時,就需要新建一個工廠實現來對應,這一點滿足開閉原則,不會修改已有類。

但是有一種情況,會導致修改原有類,那就是當目標需要在家具中新增一種家具類型的時候,比如例子中,家具組合中只包含桌子和椅子,如果再添加一種書櫃,那么所有的工廠包括工廠接口都面臨修改。


同系列文章:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM