一、模式示例
- 定义:抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
1.1、原理
- UML图
- 角色分类:
1、抽象工厂角色:模式的核心,任何工厂类都必须实现这个接口
2、具体工厂角色:抽象工厂的实现,负责实例化具体的产品对象
3、抽象角色:所有产品角色的父类,负责描述所有产品示例的公共接口
4、产品角色:模式所创建的具体示例对象
1、需求
- 以电子产品为例:华为有手机、平板、笔记本;苹果也有手机、平板、笔记本;现在我们的需求是具体工厂类根据具体的产品品牌生成相应的电子产品,而不是像工厂方法模式那样一个具体的工厂类只是单一的生成一个产品;而这里的品牌就相当于产品族,具体工厂面向的也是产品组而不是单一的产品
1.2 代码示例
1、抽象产品角色:电子产品接口
public interface Electronics {
void display();
}2、抽象角色:手机;继承自电子产品接口
public interface Call extends Electronics {
}3、抽象角色:笔记本电脑;继承自电子产品接口
public interface Computer extends Electronics{
}4、抽象角色:平板电脑;继承自电子产品接口
public interface Tablet extends Electronics{
}5、产品角色:华为手机;继承自手机接口
public class HuaWeiCall implements Call {
@Override
public void display() {
System.out.println("我是一个华为手机");
}
}6、产品角色;华为笔记本电脑
public class HuaWeiComputer implements Computer {
@Override
public void display() {
System.out.println("我是一个华为笔记本电脑");
}
}7、产品角色:华为平板电脑
public class HuaWeiTable implements Tablet{
@Override
public void display() {
System.out.println("我是一个华为平板电脑");
}
}8、产品角色:苹果手机
public class IphoneCall implements Call {
@Override
public void display() {
System.out.println("我是一个苹果手机");
}
}9、产品角色:苹果牌笔记本电脑
public class IphoneComputer implements Computer {
@Override
public void display() {
System.out.println("我是一个苹果牌笔记本电脑");
}
}10、产品角色:苹果平板电脑
public class IphoneTable implements Tablet {
@Override
public void display() {
System.out.println("我是一个苹果平板电脑");
}
}11、抽象工厂角色:电子产品生产接口
public interface ElectronicsFactory {
Electronics getCall();
Electronics getTable();
Electronics getComputer();
}12、具体工厂角色:华为工厂
public class HuaWeiFactory implements ElectronicsFactory {
@Override
public Electronics getCall() {
return new HuaWeiCall();
}
@Override
public Electronics getTable() {
return new HuaWeiTable();
}
@Override
public Electronics getComputer() {
return new HuaWeiComputer();
}
}13、具体工厂角色:苹果工厂
public class IphoneFactory implements ElectronicsFactory {
@Override
public Electronics getCall() {
return new IphoneCall();
}
@Override
public Electronics getTable() {
return new IphoneTable();
}
@Override
public Electronics getComputer() {
return new IphoneComputer();
}
}14、启动类
public class FactoryAbstractApplication {
public static void main(String[] args) {
ElectronicsFactory huaweiFactory = new HuaWeiFactory();
Electronics huaweiCall = huaweiFactory.getCall();
Electronics huaweiTable = huaweiFactory.getTable();
Electronics huaweiComputer = huaweiFactory.getComputer();
huaweiCall.display();
huaweiTable.display();
huaweiComputer.display();
System.out.println("====================================");
ElectronicsFactory iphoneFactory = new IphoneFactory();
Electronics iphoneCall = iphoneFactory.getCall();
Electronics iphoneComputer = iphoneFactory.getComputer();
Electronics iphoneTable = iphoneFactory.getTable();
iphoneCall.display();
iphoneTable.display();
iphoneComputer.display();
}
}15、测试结果

1.3、抽象工厂模式的优缺点
1、优点
- 允许客户使用抽象的接口创建一组相关产品,而不需要知道(或者关心)产出的具体产品是什么,这样客户就可以从具体的产品中解耦出来。
- 一个具体工厂可以创建多个产品,与工厂方法模式相比,可以少产生具体工厂的类数量。
- 易于交换产品系列,只要更换具体工厂,就可以改变这个产品系列。
2、缺点
- 抽象工厂是使用组合的方式把工厂方法集合到一个类中,当新增一个产品家族成员时就要修改抽象工厂类及其下面的具体工厂类,所以它的扩展性比较差。
- 每新增一个产品子类都要创建一个类,当产品子类过多时会产生很多类,导致系统复杂性加大。
















