【圖解設計模式系列】The Abstract Factory Pattern: 抽象工廠模式

Tech In Pieces發表於2020-12-29

定義:
抽象工廠模式提供了一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。

provides an interface for creating families of related or dependent objects without specifying their concrete classes.

Factory method create objects through inheritance. Abstract factory do it through object composition. Whenever you have families of related products you want to create, and you want to make sure your client create products that belong together, use Abstract Factory. When you want to decouple the client code from the concrete classes you ned to instantiate, or if you don’t know ahead of time all the concrete classes you are going to need, use Factory Method.

在這裡插入圖片描述

整潔一點 就是:
在這裡插入圖片描述
抽象工廠模式的主要角色如下:

抽象工廠(Abstract Factory):提供了建立產品的介面,它包含多個建立產品的方法 newProduct(),可以建立多個不同等級的產品。
具體工廠(Concrete Factory):主要是實現抽象工廠中的多個抽象方法,完成具體產品的建立。
抽象產品(Product):定義了產品的規範,描述了產品的主要特性和功能,抽象工廠模式有多個抽象產品。
具體產品(ConcreteProduct):實現了抽象產品角色所定義的介面,由具體工廠來建立,它 同具體工廠之間是多對一的關係。

例項

Nike公司和lining公司都會生產運動品牌產品,包括服裝產品(夾克,T恤)和鞋類產品(跑鞋,籃球鞋)。

下面用程式碼來實現。

服裝類產品

/**
 * 服裝產品
 */
public interface Clothes {

    void printUsage();

}

/**
 * 夾克
 */
public class JackClothes implements Clothes {
    
    @Override
    public void printUsage() {
        System.out.println("我是夾克衫,穿我很潮");
    }
    
}

/**
 * T恤
 */
public class TShirtClothes implements Clothes {

    @Override
    public void printUsage() {
        System.out.println("我是T恤,隨意");
    }

}

鞋類產品

/**
 * 鞋類產品
 */
public interface Shoe {
    
    void describeSelf();
}

/**
 * 跑鞋(具體的鞋類產品)
 */
public class RunningShoe implements Shoe {

    @Override
    public void describeSelf() {
        System.out.println("我是跑鞋,我為自己帶鹽");
    }

}

/**
 * 籃球鞋(具體的鞋類產品)
 */
public class BasketballShoe implements Shoe {
    
    @Override
    public void describeSelf() {
        System.out.println("我是籃球鞋,穿我打籃球吊到爆");    
    }
    
}

工廠

/**
 * 抽象工廠
 */
public interface Factory {

    /**
     * 既生產鞋類產品
     */
    Shoe produceShoe(BRAND brand);

    /**
     * 又能生產服裝類商品
     */
    Clothes produceClothes(BRAND brand);
}

/**
 * 李寧工廠,生產鞋系列產品,也生產服裝系列產品
 */
public class LiningFactory implements Factory {

    /**
     * 生產鞋系列產品
     */
    @Override
    public Shoe produceShoe(BRAND brand) {
        if (BRAND.BASKETBALL_SHOE == brand) {
            System.out.println("---李寧工廠生產籃球鞋---");
            return new BasketballShoe();
        }

        if (BRAND.RUNNING_SHOE == brand) {
            System.out.println("---李寧工廠生產跑鞋---");
            return new RunningShoe();
        }

        return null;
    }

    /**
     * 生產服裝系列產品
     */
    @Override
    public Clothes produceClothes(BRAND brand) {
        if (BRAND.JACK_CLOTHES == brand) {
            System.out.println("---李寧工廠生產夾克---");
            return new JackClothes();
        }

        if (BRAND.TSHIRT_CLOTHES == brand) {
            System.out.println("---李寧工廠生產T恤---");
            return new TShirtClothes();
        }

        return null;
    }
}

/**
 * Nike工廠,生產鞋系列產品,也生產服裝系列產品
 */
public class NikeFactory implements Factory {

    /**
     * 生產鞋子系列產品
     */
    @Override
    public Shoe produceShoe(BRAND brand) {
        if (BRAND.RUNNING_SHOE == brand) {
            System.out.println("---Nike工廠生產籃球鞋---");
            return new RunningShoe();
        }

        if (BRAND.BASKETBALL_SHOE == brand) {
            System.out.println("---Nike工廠生產跑鞋---");
            return new BasketballShoe();
        }

        return null;
    }

    /**
     * 生產服裝系列產品
     */
    @Override
    public Clothes produceClothes(BRAND brand) {
        if (BRAND.JACK_CLOTHES == brand) {
            System.out.println("---Nike工廠生產夾克---");
            return new JackClothes();
        }

        if (BRAND.TSHIRT_CLOTHES == brand) {
            System.out.println("---Nike工廠生產T恤---");
            return new TShirtClothes();
        }

        return null;
    }

}

客戶端程式碼

public class Client {

    public static void main(String[] args) {
        // Nike工廠,生產鞋系列產品(籃球鞋,跑鞋)和服裝系列產品(夾克,T恤)
        Factory nikeFactory = new NikeFactory();
        // 生產鞋系列產品
        Shoe nikeBasketballShoe = nikeFactory.produceShoe(BRAND.BASKETBALL_SHOE);// 籃球鞋
        Shoe nikeRunningshoe = nikeFactory.produceShoe(BRAND.RUNNING_SHOE);// 跑鞋
        nikeBasketballShoe.describeSelf();
        nikeRunningshoe.describeSelf();
        // 生產服裝系列產品
        Clothes nikeJack = nikeFactory.produceClothes(BRAND.JACK_CLOTHES);// 夾克衫
        Clothes nikeTshit = nikeFactory.produceClothes(BRAND.TSHIRT_CLOTHES);// T恤
        nikeJack.printUsage();
        nikeTshit.printUsage();

        System.out.println("============================");

        // 李寧工廠,生產鞋系列產品(籃球鞋,跑鞋)和服裝系列產品(夾克,T恤)
        Factory liningFactory = new LiningFactory();
        // 生產鞋系列產品
        Shoe liningBasketballShoe = liningFactory.produceShoe(BRAND.BASKETBALL_SHOE);
        Shoe liningRunningShoe = liningFactory.produceShoe(BRAND.RUNNING_SHOE);
        liningBasketballShoe.describeSelf();
        liningRunningShoe.describeSelf();
        // 生產服裝系列產品
        Clothes liningJack = liningFactory.produceClothes(BRAND.JACK_CLOTHES);
        Clothes liningTshirt = liningFactory.produceClothes(BRAND.TSHIRT_CLOTHES);
        liningJack.printUsage();
        liningTshirt.printUsage();
    }
}

相關文章