设计模式(三):抽象工厂模式

设计模式(三):抽象工厂模式

  • [1. 抽象工厂模式的介绍](#1. 抽象工厂模式的介绍)
  • [2. 抽象工厂模式的类图](#2. 抽象工厂模式的类图)
  • [3. 抽象工厂模式的实现](#3. 抽象工厂模式的实现)
    • [3.1 创建摩托车的接口](#3.1 创建摩托车的接口)
    • [3.2 创建摩托车的具体实现](#3.2 创建摩托车的具体实现)
    • [3.3 创建汽车的接口](#3.3 创建汽车的接口)
    • [3.4 创建汽车的具体产品](#3.4 创建汽车的具体产品)
    • [3.5 创建抽象工厂](#3.5 创建抽象工厂)
    • [3.6 创建具体工厂](#3.6 创建具体工厂)
    • [3.7 创建工厂生成器](#3.7 创建工厂生成器)
    • [3.8 使用工厂生成器获取工厂,通过工厂获取产品](#3.8 使用工厂生成器获取工厂,通过工厂获取产品)

1. 抽象工厂模式的介绍

抽象工厂模式(Abstract Factory Pattern)属于创建型模式,是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

通过使用抽象工厂模式,可以将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。

抽象工厂模式包含4个核心角色:

  • 抽象工厂(Abstract Factory):声明了一组用于创建产品对象的方法,每个方法对应一种产品类型。抽象工厂可以是接口或抽象类。
  • 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体产品对象的实例。
  • 抽象产品(Abstract Product):定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法。
  • 具体产品(Concrete Product):实现了抽象产品接口,定义了具体产品的特定行为和属性。

2. 抽象工厂模式的类图

3. 抽象工厂模式的实现

3.1 创建摩托车的接口

java 复制代码
package blog;

/**
 * 摩托车
 */
public interface Motorcycle {
    void by();
}

3.2 创建摩托车的具体实现

java 复制代码
package blog;

/**
 * 踏板摩托车
 */
public class Scooter implements Motorcycle{
    @Override
    public void by() {
        System.out.println("骑着一辆踏板车");
    }
}
java 复制代码
package blog;

/**
 * 弯梁摩托车
 */
public class UnderBone implements Motorcycle{
    @Override
    public void by() {
        System.out.println("骑着一辆弯梁车");
    }
}

3.3 创建汽车的接口

java 复制代码
package blog;

/**
 * 汽车
 */
public interface Car {
    void drive();
}

3.4 创建汽车的具体产品

java 复制代码
package blog;

/**
 * suv
 */
public class Suv implements Car{
    @Override
    public void drive() {
        System.out.println("开着一辆SUV");
    }
}
java 复制代码
package blog;

/**
 * mpv
 */
public class Mpv implements Car{
    @Override
    public void drive() {
        System.out.println("开着一辆MPV");
    }
}

3.5 创建抽象工厂

java 复制代码
package blog;

/**
 * 抽象工厂
 */
public interface AbstractFactory {
    Car getCar(String type);
    
    Motorcycle getMotorCycle(String type);
}

3.6 创建具体工厂

java 复制代码
package blog;

/**
 * 摩托车工厂
 */
public class MotorCycleFactory implements AbstractFactory {
    @Override
    public Car getCar(String type) {
        return null;
    }

    @Override
    public Motorcycle getMotorCycle(String type) {
        try {
            Class<?> aClass = Class.forName(type);
            return (Motorcycle) aClass.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
java 复制代码
package blog;

/**
 * 汽车工厂
 */
public class CarFactory implements AbstractFactory {
    @Override
    public Car getCar(String type) {
        try {
            Class<?> aClass = Class.forName(type);
            return (Car)aClass.getDeclaredConstructor().newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Motorcycle getMotorCycle(String type) {
        return null;
    }
}

3.7 创建工厂生成器

java 复制代码
package blog;

/**
 * 工厂生成器
 */
public class FactoryProducer {
    public static AbstractFactory getFactory(String type) {
        if ("car".equals(type)) {
            return new CarFactory();
        }

        if ("motorcycle".equals(type)) {
            return new MotorCycleFactory();
        }

        return null;
    }
}

3.8 使用工厂生成器获取工厂,通过工厂获取产品

java 复制代码
package blog;

public class AbstractFactoryDemo {
    public static void main(String[] args) {
        // 获取汽车工厂
        AbstractFactory carFactory = FactoryProducer.getFactory("car");

        // 获取suv
        Car suv = carFactory.getCar("blog.Suv");
        suv.drive();

        // 获取mpv
        Car mpv = carFactory.getCar("blog.Mpv");
        mpv.drive();

        // 获取摩托车工厂
        AbstractFactory motorcycleFactory = FactoryProducer.getFactory("motorcycle");

        // 获取scooter
        Motorcycle scooter = motorcycleFactory.getMotorCycle("blog.Scooter");
        scooter.by();

        // 获取UnderBone
        Motorcycle underBone = motorcycleFactory.getMotorCycle("blog.UnderBone");
        underBone.by();
    }
}
相关推荐
寻星探路2 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧5 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7256 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎6 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄6 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿6 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds6 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹6 小时前
【Java基础】多态 | 打卡day2
java·开发语言