JAVA设计模式——(九)工厂模式

JAVA设计模式------(九)工厂模式

介绍

定义一个 工厂类的接口,帮助一个 实际对象 创建实例 ,并让其工厂类的子类决定实例化哪个类。

理解

工厂模式中,必定分为了两部分,一部分是被工厂模式实例化的对象(Product),一部分是工厂模式的接口(Factory)。

这里主要需要注意的是一个对象,工厂类只负责一个对象的创建

实现

Product

java 复制代码
package cn.sh.designepattern.example01;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 10:41
 * @Contact 643947568@qq.com
 */
public interface Product {

    public void product();
}

实现类:

java 复制代码
package cn.sh.designepattern.example01;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 10:41
 * @Contact 643947568@qq.com
 */
public class ActualProduct implements Product {
    @Override
    public void product() {
        System.out.println("生产具体的产品");
    }
}

Factory

java 复制代码
package cn.sh.designepattern.example01;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 10:42
 * @Contact 643947568@qq.com
 */
public interface Factory {
    public Product factory();

}

工厂子类:

java 复制代码
package cn.sh.designepattern.example01;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 10:42
 * @Contact 643947568@qq.com
 */
public class ActualFactory implements Factory {
    @Override
    public Product factory() {
        return new ActualProduct();
    }
}

测试

java 复制代码
package cn.sh.designepattern.example01;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 10:18
 * @Contact 643947568@qq.com
 */
public class Main {
    public static void main(String[] args) {
        ActualFactory actualFactory = new ActualFactory();
        Product factory = actualFactory.factory();

        factory.product();
    }
}

泛型扩展

采用泛型的工厂类

java 复制代码
package cn.sh.designepattern.example02;

import java.lang.reflect.InvocationTargetException;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 11:22
 * @Contact 643947568@qq.com
 */
public interface Factory {
    public <T> T factory(Class<T> t) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException;
}
java 复制代码
package cn.sh.designepattern.example02;

import java.lang.reflect.InvocationTargetException;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 11:27
 * @Contact 643947568@qq.com
 */
public class ActualFactory implements Factory {
    @Override
    public <T> T factory(Class<T> t) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        return t.getDeclaredConstructor().newInstance();
    }
}

具体类1:

java 复制代码
package cn.sh.designepattern.example02;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 11:24
 * @Contact 643947568@qq.com
 */
public interface Product01 {
    public void product01();

}
java 复制代码
package cn.sh.designepattern.example02;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 11:24
 * @Contact 643947568@qq.com
 */
public class ActualProductO1 implements Product01{
    @Override
    public void product01() {
        System.out.println("生产01");
    }
}

具体类2:

java 复制代码
package cn.sh.designepattern.example02;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 11:24
 * @Contact 643947568@qq.com
 */
public interface Product02 {
    public void product02();


}
java 复制代码
package cn.sh.designepattern.example02;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 11:24
 * @Contact 643947568@qq.com
 */
public class ActualProductO2 implements Product02 {
    @Override
    public void product02() {
        System.out.println("生产02");
    }
}

测试:

java 复制代码
package cn.sh.designepattern.example02;

import java.lang.reflect.InvocationTargetException;

/**
 * @Author song
 * @Version 0.0.1
 * @Date 2025/4/29 11:28
 * @Contact 643947568@qq.com
 */
public class Main {

    public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        ActualFactory actualFactory = new ActualFactory();
        ActualProductO1 productO1 = actualFactory.factory(ActualProductO1.class);
        productO1.product01();


        ActualProductO2 productO2 = actualFactory.factory(ActualProductO2.class);
        productO2.product02();
    }
}

应用

上述的工厂模式是一个简单的工厂模式,每次需要对具体类均创建一个工厂类,所以适用性单一。当然也有采用泛型的工厂方法,能够适用较多的场景。

可用于对对象的封装 ,降低模块的耦合度,因为不需要知道具体类的实现细节,即使具体类的实现改变,也只需要修改具体的工厂类方法,所以有较好的扩展性

相关推荐
2601_949146532 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
曹牧2 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
KYGALYX2 小时前
服务异步通信
开发语言·后端·微服务·ruby
zmzb01032 小时前
C++课后习题训练记录Day98
开发语言·c++
爬山算法2 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7253 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎3 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄3 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
YUJIANYUE3 小时前
PHP纹路验证码
开发语言·php
忆~遂愿3 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能