创建型:抽象工厂模式

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景


1、核心思想

目的:统一管理相关对象的创建,确保产品兼容性。优先用于需要强约束产品兼容性的场景(如UI主题、跨平台适配)

概念:抽象工厂模式是工厂方法模式的扩展,适用于需要生成产品家族的场景。抽象工厂模式一定是基于产品的族系划分(一组功能相关或依赖的对象)来布局的,其产品系列一定是相对固定的,故以抽象工厂来确立工业制造标准(各产品系列生产接口)​。

举例:以汽车工厂举例,按品牌划分为A工厂和B工厂(两个族系),这两个品牌都有轿车、越野车、跑车3个系列的产品。基于这两个品牌的汽车工厂的系列生产线,如果以后加入新的C品牌汽车、D品牌汽车等,都可以沿用此种规划好的生产模式,这便是抽象工厂模式的基础数据模型。

创建型:抽象工厂模式_第1张图片
 

2、实现方式

2.1 模式结构

四个核心角色:

  • 抽象产品(AbstractProduct):定义一类产品的接口(如 轿车、越野、跑车)。

  • 具体产品(ConcreteProduct):实现抽象产品接口的类(如 A品牌轿车B品牌轿车...)。

  • 抽象工厂(AbstractFactory):声明创建产品族中每个产品的方法(如 create轿车()create越野()create跑车())。

  • 具体工厂(ConcreteFactory):实现抽象工厂接口,生成同一产品族的具体对象(如A品牌工厂、B品牌工厂)。

创建型:抽象工厂模式_第2张图片

2.2 实现案例

// 1、抽象产品
// 轿车
public interface Car {
    void runCar();
}
// 越野车
public interface SuvCar {
    void runSuvCar();
}
// 跑车
public interface SportsCar {
    void runSportsCar();
}


// 2、具体产品
// A品牌轿车
public class ABrandCar implements Car{
    @Override
    public void runCar() {
        System.out.println("A品牌轿车运行");
    }
}
// A品牌越野车
public class ABrandSuvCar implements SuvCar {
    @Override
    public void runSuvCar () {
        System.out.println("A品牌越野车运行");
    }
}
// A品牌跑车
public class ABrandSportsCar implements SportsCar {
    @Override
    public void runSportsCar () {
        System.out.println("A品牌跑车运行");
    }
}
// B品牌轿车
public class BBrandCar implements Car{
    @Override
    public void runCar() {
        System.out.println("B品牌轿车运行");
    }
}
// B品牌越野车
public class BBrandSuvCar implements SuvCar {
    @Override
    public void runSuvCar () {
        System.out.println("B品牌越野车运行");
    }
}
// B品牌跑车
public class BBrandSportsCar implements SportsCar {
    @Override
    public void runSportsCar () {
        System.out.println("B品牌跑车运行");
    }
}


// 3、抽象工厂
public interface BrandFactory {
    Car createCar();
    SuvCar createSuvCar();
    SportsCar createSportsCar();
}


// 4、具体工厂
// A品牌工厂
public class ABrandFactory implements BrandFactory{
    @Override
    public Car createCar() {
        return new ABrandCar();
    }

    @Override
    public SuvCar createSuvCar() {
        return new ABrandSuvCar();
    }

     @Override
    public SportsCar createSportsCar() {
        return new ABrandSportsCar();
    }
}
// B品牌工厂
public class BBrandFactory implements BrandFactory{
    @Override
    public Car createCar() {
        return new BBrandCar();
    }

    @Override
    public SuvCar createSuvCar() {
        return new BBrandSuvCar();
    }

     @Override
    public SportsCar createSportsCar() {
        return new BBrandSportsCar();
    }
}


// 5、客户端
public class Application {
    
    public static void main(String[] args) {
        BrandFactory factory = new ABrandFactory();
        factory.createCar();
        factory.createSuvCar();
        factory.createSportsCar();

        factory = new BBrandFactory();
        factory.createCar();
        factory.createSuvCar();
        factory.createSportsCar();
    }
}

3、优缺点分析

优点 缺点
保证产品族兼容性 新增产品类型需修改所有工厂接口
客户端与具体类解耦 代码复杂度高(类数量成倍增加)
支持灵活切换产品族(如切换主题) 难以扩展新产品(违反开闭原则)

工厂方法模式与抽象工厂模式对比

维度 工厂方法模式 抽象工厂模式
核心目的 创建单一类型对象 创建相关/依赖的对象家族
产品维度 处理一个产品等级结构(垂直方向) 处理多个产品等级结构(水平方向)
接口复杂度 单一工厂方法 包含多个工厂方法的接口
扩展方向 新增产品类型需修改代码 新增产品家族易扩展,新增产品类型难
典型应用场景 日志记录器、数据库连接器等单一产品场景 跨平台UI组件、主题系统等系列产品场景
子类数量 每个产品对应一个子类工厂 每个产品家族对应一个子类工厂

4、适用场景

  • 跨平台应用:跨平台UI组件开发(Windows/Mac风格)

  • 主题系统:切换整体风格(如深色/浅色主题)。

  • 数据库兼容:企业级应用的多数据库适配(连接器+查询器+事务管理器)

  • 游戏开发:游戏引擎的多主题支持(中世纪/科幻风格)

你可能感兴趣的:(11_设计模式,抽象工厂模式)