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();
    }
}

应用

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

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

相关推荐
暗武逢天3 小时前
Java导出写入固定Excel模板数据
java·导出数据·easyexcel·excel固定模板导出
摇滚侠3 小时前
Spring Boot3零基础教程,KafkaTemplate 发送消息,笔记77
java·spring boot·笔记·后端·kafka
杯莫停丶4 小时前
设计模式之:模板模式
开发语言·设计模式
开发者小天4 小时前
调整为 dart-sass 支持的语法,将深度选择器/deep/调整为::v-deep
开发语言·前端·javascript·vue.js·uni-app·sass·1024程序员节
lapiii3584 小时前
14天极限复习软考day4-法律、设计模式
设计模式
老猿讲编程5 小时前
C++中的奇异递归模板模式CRTP
开发语言·c++
fat house cat_6 小时前
【netty】基于主从Reactor多线程模型|如何解决粘包拆包问题|零拷贝
java·服务器·网络·netty
青云交6 小时前
Java 大视界 -- Java 大数据在智能教育学习社区互动模式创新与用户活跃度提升中的应用(426)
java·大数据·学习·flink 实时计算·智能教育社区·互动模式创新·用户活跃度
神奇的海马体6 小时前
Tomcat隐藏版本号
java·tomcat
拜见老天師6 小时前
使用mybatis-plus,实现将排序时,字段值为NULL的数据排在最后
java·mybatis