简单工厂模式

本文详细介绍了Java中的简单工厂模式,包括模式的定义、适用场景及其实现示例。通过基础和进阶示例展示了如何创建和使用简单工厂模式,强调了反射在模式中的应用。同时,文章也指出了简单工厂模式的局限性,如工厂类职责过重,不易扩展复杂产品结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java常用设计模式浅析系列

第一章 简单工厂模式



一、简单工厂模式简述

简单工厂模式(SimpleFactory Pattern)是指由一个工厂对象决定创建出哪一种产品类的实例,但它不属于 GoF 的23种设计模式。

二、适用场景

 简单工厂适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数,对于如何创建对象不需要关心。
 Spring 中的BeanFactory 就是简单工厂模式的体现,根据传入一个唯一的标识来获得 Bean 对象,
 但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

三、示例代码

1.基础示例

UML图示

图示

代码如下(示例):

ICourse
public interface ICourse {
    //录制课程
    void record();
}
JavaCourse
public class JavaCourse implements ICourse {
    @Override
    public  void record() {
        System.out.println("录制 Java 课程");
    }
}
PythonCourse
public class PythonCourse implements ICourse{
    @Override	
    public void record() {	
        System.out.println("录制 Python 视频");
    }	
}
CourseFactory

public class CourseFactory {
    public  ICourse create(String name) {
        if ("java".equals(name)) {
            //System.out.println("java");
            return new JavaCourse();
        } else if ("python".equals(name)) {
            return new PythonCourse();
        } else {
            return null;
        }
    }
}

代码测试
public class SimpleTest {
    public static void main(String[] args) {
    //父类 ICourse 指向子类 JavaCourse 的引用
    //简单工厂对象
    CourseFactory factory = new CourseFactory();
    //JavaCourse a = (JavaCourse)factory.create("java");
    //create  方法创建对象
    ICourse a = factory.create("java");
    a.record();
    ICourse b = factory.create("python");
    b.record();
    }
}

2.进阶示例

修改CourseFactory

代码如下(示例):

public class CourseFactory {
    /*public  ICourse create(String name) {
        if ("java".equals(name)) {
            //System.out.println("java");
            return new JavaCourse();
        } else if ("python".equals(name)) {
            return new PythonCourse();
        } else {
            return null;
        }*/
    
        public static ICourse create(String className) {
        if (!(null == className || "".equals(className))) {
            try {
                return (ICourse) Class.forName(className).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

对简单工厂模式继续优化,采用反射技术。


CourseFactory2
package com.Design.Simple;

public class CourseFactory2 {
    //class 使用类创建对象
    public static ICourse create(Class<? extends ICourse> clazz) {
        try {
            if (clazz != null) {
                //newInstance()方法是一个非静态方法,它只能通过类对象访问
                //返回一个新的类实例
                return clazz.newInstance();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

但还有个问题是,方法参数是字符串,可控性有待提升,而且还需要强制转型。CourseFactory2 在 CourseFactory 基础上修改。


public class SimpleFactoryTest {
    public static void main(String[] args) {
        CourseFactory factory = new CourseFactory();
        //工厂类 create JavaCourse 类
        //利用反射
        ICourse course = factory.create("com.Design.Simple.JavaCourse");
        course.record();

        //继续优化 使用classname
        CourseFactory2 factory2 = new CourseFactory2();
        ICourse course2 = factory2.create(PythonCourse.class);
        course2.record();
    }
}

修改后类图


总结

简单工厂模式也有它的缺点:工厂类的职责相对过重,不易于扩展过于复杂的产品结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值