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

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

  • [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();
    }
}
相关推荐
花好月圆春祺夏安20 分钟前
基于odoo17的设计模式详解---装饰模式
数据库·python·设计模式
慕y27420 分钟前
Java学习第十五部分——MyBatis
java·学习·mybatis
fie888921 分钟前
浅谈几种js设计模式
开发语言·javascript·设计模式
A__tao23 分钟前
SQL 转 Java 实体类工具
java·数据库·sql
哆啦A梦的口袋呀24 分钟前
《深入设计模式》模式结构汇总
设计模式
花好月圆春祺夏安27 分钟前
基于odoo17的设计模式详解---单例模式
单例模式·设计模式
喝可乐的布偶猫28 分钟前
Java类变量(静态变量)
java·开发语言·jvm
TDengine (老段)1 小时前
TDengine STMT2 API 使用指南
java·大数据·物联网·时序数据库·iot·tdengine·涛思数据
喝可乐的布偶猫1 小时前
韩顺平之第九章综合练习-----------房屋出租管理系统
java·开发语言·ide·eclipse
Code季风1 小时前
深入理解微服务中的服务注册与发现(Consul)
java·运维·微服务·zookeeper·架构·go·consul