一、基本介绍
抽象工厂模式(创建型):是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构,总而言之,抽象工厂模式用于创建一系列相关的产品族。
二、包含角色
1.抽象工厂:提供了创建产品的接口,每个具体工厂的父类接口,可以创建多个不同等级的产品。
2.具体工厂:抽象工厂的实现类,负责创建具体的产品。
3.抽象角色:需要定义产品的抽象,为工厂创建出来实例的公共接口,抽象工厂模式有多个抽象角色的产品。
4.具体产品:抽象角色的实现类,由工厂返回的具体产品实例,它和具体工厂之间是多对一的关系。
三、案例及UML类图
案例说明:
某客户需要电子产品,主要是耳机和手机,委托了目前两大著名厂商,三星和华为进行生成,这两个厂商都能生产出各自品牌且不同的耳机,以后可能还会订购苹果品牌产品。
UML类图:
类ElectronicFactory:
public interface ElectronicFactory {
/**
* 创建电话
* @return 电话类
*/
Phone createPhone();
/**
* 创建耳机
* @return 耳机类
*/
Headset createHeadset();
}
说明:电子工厂抽象类,抽象工厂角色,用于定义工厂生产的接口(产品),生产耳机和手机。
类HuaWeiFactory:
public class HuaWeiFactory implements ElectronicFactory {
@Override
public Phone createPhone() {
return new HuaWeiPhone();
}
@Override
public Headset createHeadset() {
return new HuaWeiHeadset();
}
}
说明:华为工厂,抽象工厂的一个实现类,具体工厂角色,生产华为品牌的耳机和手机。
类SanXingFactory:
public class SanXingFactory implements ElectronicFactory {
@Override
public Phone createPhone() {
return new SanXingPhone();
}
@Override
public Headset createHeadset() {
return new SanXingHeadset();
}
}
说明:三星工厂,抽象工厂的一个实现类,具体工厂角色,生产三星品牌的耳机和手机。
类Headset:
public interface Headset {
void listen();
}
说明:耳机抽象类,抽象角色,用于定义耳机的公共接口listen(听歌)。
类Phone:
public interface Phone {
void call();
}
说明:手机抽象类,抽象角色,用于定义手机的公共接口call(打电话)。
类HuaWeiHeadset:
public class HuaWeiHeadset implements Headset {
@Override
public void listen() {
System.out.println("正在使用华为耳机听音乐!");
}
}
说明:华为耳机类,具体产品角色。
类HuaWeiPhone:
public class HuaWeiPhone implements Phone {
@Override
public void call() {
System.out.println("正在使用华为手机打电话!");
}
}
说明:华为手机类,具体产品角色。
类SanXingHeadset:
public class SanXingHeadset implements Headset {
@Override
public void listen() {
System.out.println("正在使用三星耳机听音乐!");
}
}
说明:三星耳机类,具体产品角色。
类SanXingPhone:
public class SanXingPhone implements Phone {
@Override
public void call() {
System.out.println("正在使用三星手机打电话!");
}
}
说明:三星手机类,具体产品角色。
类AbstractFactoryTest:
public class AbstractFactoryTest {
public static void main(String[] args) {
ElectronicFactory electronicFactory = new SanXingFactory();
Headset sanXingHeadset = electronicFactory.createHeadset();
sanXingHeadset.listen();
Phone sanxingPhone = electronicFactory.createPhone();
sanxingPhone.call();
electronicFactory = new HuaWeiFactory();
Headset huaWeiHeadset = electronicFactory.createHeadset();
huaWeiHeadset.listen();
Phone huaWeiPhone = electronicFactory.createPhone();
huaWeiPhone.call();
}
}
说明:测试以及客户端类。
四、优缺点
优:此模式与工厂方式模式类似,只不过该模式生产的是多种类产品。如果产品种类不变,则可无限拓展。
缺:当新增一个产品种类时,所有的具体工厂都需要改变,改动代码量大。
五、适用场景
1.适用于创建一系列相关的产品族使用。
六、其它
注意:抽象工厂模式并不完全符合开闭原则,在该模式中工厂是符合开闭原则,但产品种类是不符合开闭原则。