Java設計模式之抽象工廠

前言

如果前面已經學習了工廠模式抽象工廠學習起來也很簡單,只是對工廠模式做了關於產品族產品等級結構概念的擴展。

先解釋什麼是產品族和產品等級結構
比如你擁有一個衣櫃,衣櫃裏有襯衣,有夾克,有外套,有牛仔庫,有休閒褲,有西服,有西褲……

這裏的衣服有休閒的,有正式的,有時尚等等多種風格,每一種風格分別又有自己的部件,比如上衣、褲子。

同一種風格、能夠同時搭配的衣物組合就是一個產品族,同一個產品族下面的衣帽褲鞋就是不同的產品等級結構。比如西裝、西褲、皮鞋,這就屬於同一產品族,而T恤和牛仔褲就是另一個產品族;而牛仔庫和西褲又屬於同一產品等級結構

抽象工廠使用廠場景:系統的產品有多於一個的產品族,而系統只消費其中某一族的產品。

抽象工廠

先了解了上面的概念,接下來就通過代碼的形式構造上述場景所展示的設計模式。

先寫出各種產品的接口

Clothe.java

// 上衣產品接口
public interface Clothe {
    void show();// 打印信息
}

Pant.java

// 褲子產品接口
public interface Pant {
    void show();// 打印信息
}

Shoe.java

// 鞋子產品接口
public interface Shoe {
    void show();// 打印信息
}

接下來分別寫出西裝休閒裝這兩個產品族的具體產品實現類

西裝產品族:
WesternClothe.java

// 西裝上衣產品
public class WesternClothe implements Clothe {
    @Override
    public void show() {
        System.out.println("西服");
    }
}

WesternPant.java

// 西褲產品
public class WesternPant implements Pant {
    @Override
    public void show() {
        System.out.println("西褲");
    }
}

LeatherShoes.java

// 皮鞋產品
public class LeatherShoes implements Shoe {
    @Override
    public void show() {
        System.out.println("皮鞋");
    }
}

休閒裝產品族:

TShirt.java

// T恤產品
public class TShirt implements Clothe {
    @Override
    public void show() {
        System.out.println("T恤");
    }
}

Jeans.java

// 牛仔褲產品
public class Jeans implements Pant {
    @Override
    public void show() {
        System.out.println("牛仔褲");
    }
}

CanvasShoe.java

// 帆布鞋產品
public class CanvasShoe implements Shoe {
    @Override
    public void show() {
        System.out.println("帆布鞋");
    }
}

然後寫出工廠接口,可以注意到抽象工廠模式工廠模式的工廠接口的區別在於,工廠模式接口只生產某一類產品,而抽象工廠模式生產的是一套產品族

Factory.java

// 工廠接口
public interface Factory {
    Clothe produceCloth();// 生產上衣

    Pant producePant();// 生產褲子

    Shoe produceShoe();// 生產鞋子
}

WesternFacroty.java

// 西裝產品工廠類
public class WesternFacroty implements Factory {
    @Override
    public Clothe produceCloth() {
        return new WesternClothe();
    }

    @Override
    public Pant producePant() {
        return new WesternPant();
    }

    @Override
    public Shoe produceShoe() {
        return new LeatherShoes();
    }
}

LeisureFactory.java

// 休閒裝產品工廠類
public class LeisureFactory implements Factory {
    @Override
    public Clothe produceCloth() {
        return new TShirt();
    }

    @Override
    public Pant producePant() {
        return new Jeans();
    }

    @Override
    public Shoe produceShoe() {
        return new CanvasShoe();
    }
}

Main.java

// 抽象工廠調用過程
public class Main {
    public static void main(String[] args) {
        Factory factory = new WesternFacroty(); // 西裝產品工廠
        Clothe clothe = factory.produceCloth(); // 生產上衣
        Pant pant = factory.producePant(); // 生產褲子
        Shoe shoe = factory.produceShoe(); // 生產鞋子
        clothe.show();  // 打印西服
        pant.show();    // 打印西褲
        shoe.show();    // 打印皮鞋
        System.out.println("===切換產品族====");
        factory = new LeisureFactory(); // 切換到休閒裝產品工廠
        clothe = factory.produceCloth();// 生產上衣
        pant = factory.producePant();   // 生產褲子
        shoe = factory.produceShoe();   // 生產鞋子
        clothe.show();  // 打印T恤
        pant.show();    // 打印牛仔褲
        shoe.show();    // 打印帆布鞋
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章