工厂模式—简单工厂模式(传统,加反射)

本文介绍了简单工厂模式,包括其核心组成部分和本质——根据传入参数动态选择具体类实例。同时,文章讨论了该模式的缺陷,即当增加新产品时需要修改工厂类,违反开闭原则。为解决这一问题,文章提出了利用反射技术,使得在增加新产品时无需修改工厂类代码,实现了更灵活的扩展性。

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

简单工厂模式:
核心:一个接口,一个继承接口的集具体类,一个工厂类
本质:工厂类的生产产品实例根据创建实例时传入参数的不同,动态的选择应该创建哪一个具体类的实例。

interface IFruit{
    public void eat();
}
//产品类
class Apple implements IFruit{

    @Override
    public void eat() {
        System.out.println("eat apple!");
    }
}
//工厂类
class FruitFactory{
    private FruitFactory(){}
    public static IFruit getInstance(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        if ("apple".equals(className)){
            return new Apple();
        }
        return null;
    }
}
public class FactoryDemo {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        IFruit fruit = FruitFactory.getInstance("Apple" );
        fruit.eat();
    }
}

缺陷:如果增加一个新产品(就是增加实现接口的继承类类),那就需要在工厂类的生产产品实例中修改代码,这样违反了开闭原则
这时可以引入反射:

class FruitFactory{
    private FruitFactory(){}
    public static IFruit getInstance(String className) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        //反射实现简单工厂模式
        //这时不再需要在工厂类中修改代码,而是根据调用方法时传入类名
        //再通过反射取得该类实例 这就动态的获得了不同的具体类对象
        IFruit iFruit;
        iFruit = (IFruit) Class.forName(className).newInstance();
        return iFruit;
    }
}
public class FactoryDemo {
    public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
        IFruit fruit = FruitFactory.getInstance("www.bite.reflect.Apple" );
        fruit.eat();
    }
}

当增加同一个新的产品类时,不需要再修改代码增加if-else分支,而是在工厂类的生产产品实例的方法中接收一个产品类的名称,在方法内部使用反射获取该产品类的实例,这样做无论增加多少产品类都不需要去修改工厂类的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值