前言
如果前面已經學習了工廠模式,抽象工廠學習起來也很簡單,只是對工廠模式做了關於產品族和產品等級結構概念的擴展。
先解釋什麼是產品族和產品等級結構:
比如你擁有一個衣櫃,衣櫃裏有襯衣,有夾克,有外套,有牛仔庫,有休閒褲,有西服,有西褲……
這裏的衣服有休閒的,有正式的,有時尚等等多種風格,每一種風格分別又有自己的部件,比如上衣、褲子。
同一種風格、能夠同時搭配的衣物組合就是一個產品族,同一個產品族下面的衣帽褲鞋就是不同的產品等級結構。比如西裝、西褲、皮鞋,這就屬於同一產品族,而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(); // 打印帆布鞋
}
}