首页 > 其他分享 >彻底玩转工厂模式

彻底玩转工厂模式

时间:2024-11-21 17:15:31浏览次数:3  
标签:buy 彻底 Car 模式 工厂 玩转 new public

一.基础概念

1.作用:
        实现了创建者和调用者的分离(创建型模式)。

2.核心本质:
        实例化对象不使用new,用工厂方法代替;
        将选择实现类,创建对象统一管理和控制,从而将调用者跟我们的实现类解耦。       

3.三种模式:
        简单工厂模式:用来生产同一等级结构中的任意产品(对于新增的产品,需要覆盖已有代码);
        工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品);
        抽象工厂模式:围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。


4.满足的 OOP七大原则
        开闭原则:一个软件的实体应当对扩展开放,对修改关闭;
        依赖倒转原则:要针对接口编程,不要针对实现编程;
        迪米特法则:只与你直接的朋友通信,而避免和陌生人通信。

二. 简单工厂模式(静态工厂模式)

 准备如下几个汽车类:

public interface Car {
    void buy();
}
public class Aito implements Car{
    @Override
    public void buy() {
        System.out.println("购买了一辆问界");
    }
}
public class Luxeed implements Car{
    @Override
    public void buy() {
        System.out.println("购买了一辆智界");
    }
}

 原来消费者需要购买汽车的时候的,需要如下操作:

public class Consumer {
    public static void main(String[] args) {
        Car car1 = new Aito();
        Car car2 = new Luxeed();

        car1.buy(); // 购买了一辆问界
        car2.buy(); // 购买了一辆智界
    }
}

这个操作需要我们去了解所有的接口、实现类(Aito类和Luxeed类),如果不知道具体信息就没法进行下一步操作,但是在真实的场景中,我们只需要Car类,它里面有什么东西我们并不需要了解;

比如现实中买车,想买一个问界,并不需要知道车是怎么生产的,只需要花钱买就行了,但是这里使用的new相当于就是自己造的车,而实际中汽车是通过工厂来的。

接下来,创建一个工厂:

public class CarFactory {
    public static Car getcar(String car) {
        if (car.equals("问界")) {
            return new Aito();
        } else if (car.equals("智界")) {
            return new Luxeed();
        } else {
            return null;
        }
    }
}

 通过工厂进行购买汽车:

public class Consumer {
    public static void main(String[] args) {
        Car car1 = CarFactory.getcar("问界");
        Car car2 = CarFactory.getcar("智界");

        car1.buy(); // 购买了一辆问界
        car2.buy(); // 购买了一辆智界
    }
}

假如Aito()里面有很多参数,通过new的方式就需要带大量参数,这种带大量参数的创建方式,自己去写很繁琐的,但是我们写一个车工厂,它就可以帮我们做这些繁琐的事,它把事情做完,我们根本不用关心里面是否有其他细节,只需要直接调用即可,这是一种最快捷的方法,如下图所示:

但是它也有不好的地方,如果我们还需要添加一个享界,那么还需要创建一个Stelato类,并且实现Car接口,然后还需要在CarFactory中添加一个else if来修改工厂的逻辑,这也就是说,如果新增加一个产品,如果不修改代码,是做不到的,但是这样就不满足开闭原则了。

但是在大多数情况下,我们使用的就是简单工厂模式,因为要满足开闭原则,就需要付出更多的代价,也就是使用工厂方法模式。

二.工厂方法模式

同样需要准备简单工厂模式中的Car、Aito、Luxeed三个类

接下来,创建一个car工厂:

public interface CarFactory {
    Car getCar();
}

创建Aito工厂: 

public class AitoFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Aito();
    }
}

创建Luxeed工厂:

public class LuxeedFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Luxeed();
    }
}

  此时消费者购买汽车:

public class Consumer {
    public static void main(String[] args) {
        Car car1 = new AitoFactory().getCar();
        Car car2 = new LuxeedFactory().getCar();

        car1.buy(); // 购买了一辆问界
        car2.buy(); // 购买了一辆智界
    }
}

只需要找到对应汽车的工厂即可,此时如果需要新增一个车,只需要实现Car、CarFactory接口即可,不需要修改原来的类,这就满足了开闭原则。

例如增加享界汽车:

public class Stelato implements Car{
    @Override
    public void buy() {
        System.out.println("购买了一辆享界");
    }
}
public class StelatoFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Stelato();
    }
}

 此时购买享界:

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

        car.buy(); // 购买了一辆享界
    }
}

虽然现在满足的开闭原则,但是明显发现代码量变多了很多,以后每多一个车,都要多一个扩展类,这样的扩展类就会越来越庞大,这样实现起来,反而是非常麻烦,如下图所示:

所以,大多少情况下,我们还是会使用简单工厂模式。

(1)从结构复杂度、代码复杂度、编程复杂度、管理上的复杂度来看,都是简单工厂模式更合适;

(2)根据设计原则,需要采用工厂方法模式,但是根据实际义务一般会采用简单工厂模式。

三.总结 

1.简单工厂模式(静态工厂模式):虽然某种程度上不符合设计原则,但实际使用最多;

2.工厂方法模式:不修改已有类的前提下,通过增加新的工厂类实现扩展;

3.抽象工厂模式:不可以增加产品,可以增加产品族。

PS:作为一种创建类模式,在任何需要生成复杂对象的地方,都可以使用工厂方法模式;有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式;如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度

四.应用场景

1.日志记录时可以让用户选择记录到什么地方;

2.数据库访问时可以让用户选择具体使用什么数据库;

3.设计一个连接服务,需要访问多种协议时,可以把多种协议定作为产品类,共同实现一个接口,供用户选择。

标签:buy,彻底,Car,模式,工厂,玩转,new,public
From: https://blog.csdn.net/BestandW1shEs_lsy/article/details/143836541

相关文章

  • 软件设计模式————(抽象工厂模式)
    [实验任务一]:人与肤色使用抽象工厂模式,完成下述产品等级结构: 实验要求:1.画出对应的类图; 2.提交源代码;publicclassBlackFactoryimplementsPeopleFactory{@OverridepublicManproduceMan(){returnnewBlackMan();}@Override......
  • 软件设计模式————(工厂方法模式)
    [实验任务一]:加密算法目前常用的加密算法有DES(DataEncryptionStandard)和IDEA(InternationalDataEncryptionAlgorithm)国际数据加密算法等,请用工厂方法实现加密算法系统。实验要求:1.画出对应的类图; 2.提交该系统的代码,该系统务必是一个可以能够直接使用的系统,查阅资料完......
  • 工厂员工操作顺序识别检测系统
    工厂员工操作顺序识别检测系统通过在现场安装的监控摄像头,工厂员工操作顺序识别检测系统实时捕捉工人的操作行为。系统不仅能够检测工人是否按照既定的操作顺序执行任务,还能判断他们是否使用了正确的工具,以及是否遵守了相关的安全规定。系统能够实时接收监控视频流,并快速进行处理......
  • 一看就懂的 UniApp 数据缓存 API:一篇文章带你玩转本地存储!
    UniApp数据缓存API全面解析与最佳实践在多平台跨端开发中,数据缓存是不可或缺的功能。UniApp提供了一套强大的数据缓存API,支持本地数据的存储、读取、删除和管理,适用于多种开发场景。本文将详细介绍这些API的功能、参数及使用方法,并分享一些实际开发中的应用技巧。数据缓......
  • GA/T1400视图库平台EasyCVR大华设备视频平台智慧工厂安防视频监控预警方案
    在当今高速发展的工业环境中,工厂的安全与效率管理愈发受到重视。为应对日益复杂的生产场景和安全挑战,GA/T1400视图库平台EasyCVR智慧工厂安防视频监控预警方案应运而生。方案融合先进的视频监控技术、人工智能(AI)和大数据分析,通过高清摄像头和智能分析软件的协同工作,为工厂提供了全......
  • SpringBoot珠宝首饰工厂管理系统oy7a2(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容项目名称:珠宝首饰工厂管理系统一、项目背景随着珠宝首饰行业的快速发展,工厂的生产效率、成本控制和品质管理成为影响企业竞争力的关键因素。为了......
  • SMARTFORMS函数调用完整示例:打印工厂物料信息
    首先规划想要打印的效果和信息,这里示例的是想要打印物料数据库里面的信息。①对相关数据表创建表结构:SE11 注意数据类型,数量quan需要参考类型:创建表结构:②创建一个REPORT程序,并对相关的字段、变量、内表进行声明,并写一个SELECTION界面和一些基础的取数等,具体代码如下:DATA......
  • 工厂流水线平台管理系统,设计出色,让人喜爱
    工厂流水线平台管理系统的出色设计令人赞叹。它以直观的界面呈现流水线各环节信息,从物料供应到加工流程再到成品产出,一目了然。色彩区分不同的工作状态,比如绿色代表正常运行,红色表示故障,方便管理人员快速识别。功能上,能实时监控生产进度,精准统计产量、次品率等数据,为决策提供......
  • 玩转合宙Luat教程 驱动篇⑧——IIC通信读取温流量传感器FR03H
    文章目录一、前言二、FR03H介绍三、寄存器和指令四、流量与转换4.1转换系数4.2流量计算五、驱动解析5.1i2c驱动封装5.2设备寄存区读取封装六、应用解析七、源码下载八、参考一、前言教程目录大纲请查阅:玩转合宙Luat教程——导读二、FR03......
  • Python设计模式详解之2 —— 工厂模式
    工厂模式(FactoryPattern)是一种创建型设计模式,旨在定义一个用于创建对象的接口,但由子类决定实例化哪个类。工厂模式可以帮助我们将对象的创建与其使用分离,增强代码的可扩展性和维护性。工厂模式的分类简单工厂模式(SimpleFactoryPattern)工厂方法模式(FactoryMethodPatte......