在工厂方法模式中,具体工厂生产具体的产品,每一个具体的工厂对应一种具体的产品,工厂方法具有唯一性。但有时候,希望一个工厂可以生产多个产品对象,而不是单一的产品对象,如一个电器工厂,既可以生产电视机,也可以生产电冰箱、空调、电饭锅等多种电器,而不是只生产一种电器,这时就需要抽象工厂模式
为了更好理解抽象工厂模式,先引入两个概念,产品等级结构和产品族
产品等级结构:产品等级结构,也可以称为产品的继承结构,如一个抽象类是手机,则它的子类有华为手机、小米手机、oppo手机等,抽象手机与具体的品牌手机之间构成了一个产品等级结构,抽象手机是父类,具体的品牌手机是其子类
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如华为工厂生产华为手机、华为耳机,华为手机位于手机产品等级结构中;华为耳机位于耳机产品等级结构中,华为手机、华为耳机构成一个产品族
产品等级结构与产品族示意图如下
图中,不同颜色的多个长方形、圆形、椭圆形分别构成 3 个不同的产品等级结构,而相同颜色的长方形、圆形、椭圆形构成一个产品族。只要确定一个产品的产品族及其所属的等级结构,就可以确定这个产品
当系统提供的工厂生产的产品是位于不同产品等级结构、不同类型的具体产品时,就需要使用抽象工厂模式。
抽象工厂模式示意图
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖的对象的接口,而无需指定它们具体的类。抽象工厂模式也称为 Kit 模式,是一种对象创建型模式
下面以制作书籍为例,代码演示抽象工厂模式
定义抽象图书类
package com.design.abstractfactory;
/**
* 抽象图书类
*/
public abstract class Book {
public abstract void produce();
}
定义文学书类,继承抽象图书类
package com.design.abstractfactory;
/**
* 文学书
*/
public class LiteratureBook extends Book{
@Override
public void produce() {
System.out.println("制作文学书");
}
}
定义哲学书类,继承抽象图书类
package com.design.abstractfactory;
/**
* 哲学书
*/
public class PhilosophyBook extends Book{
@Override
public void produce() {
System.out.println("制作哲学书");
}
}
定义抽象包装盒类
package com.design.abstractfactory;
/**
* 抽象包装盒类
*/
public abstract class Box {
public abstract void produce();
}
定义文学书包装盒类,继承抽象包装盒类
package com.design.abstractfactory;
/**
* 文学书包装盒
*/
public class LiteratureBox extends Box{
@Override
public void produce() {
System.out.println("制作文学书包装盒");
}
}
定义哲学书包装盒类,继承抽象包装盒类
package com.design.abstractfactory;
/**
* 哲学书包装盒
*/
public class PhilosophyBox extends Box{
@Override
public void produce() {
System.out.println("制作哲学书包装盒");
}
}
定义书籍工厂接口
package com.design.abstractfactory;
/**
* 书籍工厂接口
*/
public interface BookFactory {
Book getBook();
Box getBox();
}
定义文学书籍工厂,实现书籍工厂接口
package com.design.abstractfactory;
/**
* 生产文学书和文学书包装盒的工厂
*/
public class LiteratureFactory implements BookFactory{
@Override
public Book getBook() {
return new LiteratureBook();
}
@Override
public Box getBox() {
return new LiteratureBox();
}
}
定义哲学书籍工厂,实现书籍工厂接口
package com.design.abstractfactory;
/**
* 生产哲学书和哲学书包装盒的工厂
*/
public class PhilosophyFactory implements BookFactory{
@Override
public Book getBook() {
return new PhilosophyBook();
}
@Override
public Box getBox() {
return new PhilosophyBox();
}
}
至此,抽象工厂模式代码演示完成
可以看出,文学书籍工厂可以生产文学书和文学书包装盒;哲学书籍工厂生产哲学书和哲学书包装盒。文学书籍和文学书籍包装盒构成产品族,哲学书籍和哲学书籍包装盒构成另一个产品族
类图如下
测试调用
package com.design.abstractfactory;
/**
* 测试调用
*/
public class TestMain {
public static void main(String[] args) {
//哲学书籍工厂
PhilosophyFactory philosophyFactory = new PhilosophyFactory();
//制作书籍
Book book = philosophyFactory.getBook();
book.produce();
//制作书籍包装盒
Box box = philosophyFactory.getBox();
box.produce();
}
}