前言
如果前面已经学习了工厂模式,抽象工厂学习起来也很简单,只是对工厂模式做了关于产品族和产品等级结构概念的扩展。
先解释什么是产品族和产品等级结构:
比如你拥有一个衣柜,衣柜里有衬衣,有夹克,有外套,有牛仔库,有休闲裤,有西服,有西裤……
这里的衣服有休闲的,有正式的,有时尚等等多种风格,每一种风格分别又有自己的部件,比如上衣、裤子。
同一种风格、能够同时搭配的衣物组合就是一个产品族,同一个产品族下面的衣帽裤鞋就是不同的产品等级结构。比如西装、西裤、皮鞋,这就属于同一产品族,而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(); // 打印帆布鞋
}
}