设计模式-工厂模式

本文介绍了Java中的简单工厂模式和工厂方法模式,通过创建车类实例的示例,展示了如何封装对象创建逻辑,以及如何应用开闭原则避免代码修改。两者在结构和编程复杂度上有所区别,适合理解和实践设计模式。

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

前言
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏:计算机基础专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏

简介

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类型的对象。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

接下来我们就以创建车为例

一、简单工厂模式

目录结构:
在这里插入图片描述

1.1定义Car接口

public interface Car {
        void getInfo();
}

这里我们就简单的写一个方法就行了

1.2写多个车类并实现Car接口

实现一

public class BBCar implements Car {
    @Override
    public void getInfo() {
        System.out.println("BB车");
    }
}

实现二

public class HQCar implements Car {
    @Override
    public void getInfo() {
        System.out.println("红旗车");
    }
}

1.3创建工厂方法

public class CarFactory {
    public static Car getCar(String name){
        if("红旗".equals(name)){
            return new HQCar();
        }else if("BB车".equals(name)){
            return new BBCar();
        }else {
            return null;
        }
    }

}

这里我们用了很多if-else语句【等一下消除if-else】 来判断工厂最后创建什么车

1.4创建消费者来获取车

public class Consumer {
    public static void main(String[] args) {
        Car car1 = CarFactory.getCar("红旗");
        Car car2 = CarFactory.getCar("BB车");

        car1.getInfo();
        car2.getInfo();
    }
}

最后输出结果也能得到车
在这里插入图片描述

1.5我们来消除工厂方法的if-else

public class CarFactory {

    private static final Map<String, Car> carHashMap = new HashMap<String, Car>();

    static {
        carHashMap.put("红旗",new HQCar());
        carHashMap.put("BB车",new BBCar());
    }

    public static Car getCar(String name){
        return carHashMap.get(name);
    }
}

这里我们用了HashMap来提前创建了各个车 这样就能直接返回对应的对象了

但是
我们又多了新的车了 是不是要去修改工厂方法?添加if-else结构或者在HashMap中添加新的元素! 显然不符合开闭原则
那有没有不改动原来的工厂模式呢?答案是有的 接下来看 工厂方法模式

二、工厂方法模式

在这里插入图片描述
大致思路就是给每个车都实现对应的车工厂

2.1Car接口和工厂接口

public interface Car {
        void getInfo();
}
public interface CarFactory {
    Car getCar();
}

然后每一个车都要实现car类 ,然后实现工厂接口去创建对应的车

2.2对应的车工厂

public class BBCarFactoryImpl implements CarFactory {
    @Override
    public Car getCar() {
        return new BBCar();
    }
}

public class HQCarFactoryImpl implements CarFactory {
    @Override
    public Car getCar() {
        return new HQCar();
    }
}

2.3消费者获取车

public class Consumer {
    public static void main(String[] args) {
        Car car = new BBCarFactoryImpl().getCar();
        Car car1 = new HQCarFactoryImpl().getCar();
        car.getInfo();
        car1.getInfo();

    }
}

在这里插入图片描述

这样我们添加一个新车都不会修改原来的代码了 ,就只需要实现对应的工厂就行了

对比

对比:
结构复杂度: 简单工厂模式!(复杂度低)
代码复杂度: 简单工厂模式!(复杂度低)
管理上的复杂度: 简单工厂模式!(复杂度低)
编程复杂度:简单工厂模式!(复杂度低)
根据设计原则: 工厂方法模式!(复杂度低)
根据实际业务: 简单工厂模式!(复杂度低)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑霸final

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值