首页 > 其他分享 >设计模式--工厂方法模式【创建型模式】

设计模式--工厂方法模式【创建型模式】

时间:2024-12-19 15:57:15浏览次数:5  
标签:String -- Car 模式 工厂 设计模式 public

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

在这里插入图片描述

设计模式系列文章传送门

设计模式–单例模式【创建型模式】

什么是工厂方法模式

工厂模式又叫做工厂方法模式,是一种创建型的模式,在父类提供一个创建对象的方法,允许子类决定实例化对象的类型,由子类来决定要实例化的是哪一个工厂类,工厂模式让创建对象的过程延迟到子类进行,同时也实现了调用者和实现类解耦,提高了系统的可扩展性和灵活性,这同时也是去掉众多 if else 的实现⽅式。

静态工厂方法模式

静态工厂模式通过一个工厂类来创建对象。

静态工厂方法案例

我们假设有小米、小鹏、未来三款车需要制造,车厂是根据起汽车名称来生产汽车的,当前场景可以抽象出如下类。

car 接口

定义了车名称的方法,代码如下:

public interface Car {
    
    void carName();
}

XiaoMiCar 类

XiaoMiCar 实现了 Car 接口,代码如下:

public class XiaoMiCar implements Car{
    @Override
    public void carName() {
        System.out.println("car name is xiaomi");
    }
}

XiaoPengCar 类

XiaoPengCar 实现了 Car 接口,代码如下:

public class XiaoPengCar implements Car{
    @Override
    public void carName() {
        System.out.println("car name is xiaopeng");
    }
}

WeiLaiCar 类

WeiLaiCar 实现了 Car 接口,代码如下:

public class WeiLaiCar implements Car{
    @Override
    public void carName() {
        System.out.println("car name is weilai");
    }
}

CarFactory 生产车的工厂类

CarFactory 提供了一个根据车的名称生成 car 的类,代码如下:

public class CarFactory {

    //根据 car name 创建 car 对象
    public static Car createCarByName(String carName) {
        if ("xiaomi".equals(carName)) {
            return new XiaoMiCar();
        } else if ("xiaopeng".equals(carName)) {
            return new XiaoPengCar();
        } else if ("weilai".equals(carName)) {
            return new WeiLaiCar();
        } else {
            return null;
        }
    }

}

CarClient

生产 Car 的客户端类如下:

public class CarClient {

    public static void main(String[] args) {
        Car xiaomi = CarFactory.createCarByName("xiaomi");
        xiaomi.carName();
        Car xiaopeng = CarFactory.createCarByName("xiaopeng");
        xiaopeng.carName();
        Car weilai = CarFactory.createCarByName("weilai");
        weilai.carName();
    }

}

运行 CarClient 执行结果如下:

car name is xiaomi
car name is xiaopeng
car name is weilai

CarClient 类使用 CarFactory 创建出来的具体 Car 实例来实现 Car 的相关功能,这就是简单工厂模式。

可以看到静态工厂(简单工厂)模式代码实现简单,但是添加新的 Car 类型时候需要修改工厂类,对象的创建也是由工厂类来实现的。

工厂方法模式

工厂方法模式定义了一个用于创建对象的接口,让子类来决定实例化那个类。

Car

车产品属性定义接口如下:

public interface Car {

    //汽车品牌
    String getBrand();

    //汽车创始人
    String getFounder();

    //汽车型号
    String getModel();

    //汽车颜色
    String getColor();
    
}

CarFactory

车工厂接口定义如下:

public interface CarFactory {

    //生产汽车接口
    Car createCar();

}

有了车工厂定义接口,各个车品牌可以实现车工厂接口,也就是具体的车工厂实现类。

XiaoMiCarFactory

小米车工厂实现类如下:

public class XiaoMiCarFactory implements CarFactory{
    @Override
    public Car createCar() {
        return new XiaoMiCar();
    }
}

XiaoPengCarFactory

小鹏车工厂实现类如下:

public class XiaoPengCarFactory implements CarFactory{
    @Override
    public Car createCar() {
        return new XiaoPengCar();
    }
}

CarClient

车客户端如下:

public class CarClient {

    public static void main(String[] args) {
        XiaoMiCarFactory xiaoMiCarFactory = new XiaoMiCarFactory();
        Car xiaoMiCar = xiaoMiCarFactory.createCar();
        String brand = xiaoMiCar.getBrand();
        String color = xiaoMiCar.getColor();
        String founder = xiaoMiCar.getFounder();
        String model = xiaoMiCar.getModel();
        System.out.println(brand+"--"+founder+"--"+model+"--"+color);

        XiaoPengCarFactory xiaoPengCarFactory = new XiaoPengCarFactory();
        Car xiaoPengCar = xiaoPengCarFactory.createCar();
        String xiaoPengBrand = xiaoPengCar.getBrand();
        String xiaoPengColor = xiaoPengCar.getColor();
        String xiaoPengFounder = xiaoPengCar.getFounder();
        String xiaoPengModel = xiaoPengCar.getModel();
        System.out.println(xiaoPengBrand+"--"+xiaoPengFounder+"--"+xiaoPengModel+"--"+xiaoPengColor);

    }

}

我们使用小米车工厂类生产小米汽车,使用小鹏车工厂实现类生产小鹏汽车。

执行客户端代码,执行结果如下:

小米--雷布斯--su7--蓝色
小鹏--何小鹏--小鹏P7--炫酷黑

至此工厂方法模式已经实现完毕。

思考:工厂方法给我们带来了什么作用呢?

工厂方法的优缺点

优点

  • 将对象的创建过程抽离出来,使得客户端代码可以清晰的表达自己的意图,且可以与具体的车产品类解耦,提高了代码的灵活性和可读性。
  • 定义了统一的工厂类接口,新增车类型只需要,实现统一的工厂类接口即可,易于扩展。
  • 每种车类型都有自己的实现类,新增、修改、删除某个车类型实现类,相互补影响,减少了软件测试成本。

缺点:

  • 工厂方法模式需要客户端代码实例化具体的工厂对象,这在一定程度上会导致代码的复杂性和耦合性增加。
  • 工厂方法模式会增加应用程序的类的数量,我们每增加一个车类型都需要为创建一个具体工厂。

总结:本篇分享了工厂方法模式的使用方法,其中也分析了简单工厂模式,希望可以帮助到有需要的朋友。

如有不正确的地方欢迎各位指出纠正。

标签:String,--,Car,模式,工厂,设计模式,public
From: https://blog.csdn.net/weixin_42118323/article/details/144222854

相关文章

  • 实验6
    任务4代码1#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];//isbn号6charname[80];//书名7charauthor[80];//作者8doublesales_price;//售价9intsales_count;......
  • Qt鼠标悬浮Hover消息不触发,只有鼠标单击才会触发消息?
    1.Qt鼠标悬浮Hover消息不触发,只有鼠标单击才会触发消息?下面的工具配置,想要鼠标悬浮在工具菜单上时,显示删除的图标;但是发现怎么都触发不了boolCBaseToolListWidget::eventFilter(QObject*ptr_object,QEvent*ptr_event){if(this==ptr_object){......
  • Redis API(springboot整合,已封装)
    目录结构maven导包pom.xmlapplication.ymlredis配置类编写Service方法调用示例结构maven导包pom.xml依赖项主要添加如下<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-re......
  • vue-进行分组----将轮播图数据进行分组
    效果展示第一步将数据进行分组处理例如:数据是这样的处理方法一:进行两次for循环处理方法二:进行一次for循环......
  • 宝塔9.0.0 搭建前后端分离项目
    目录宝塔安装项目技术栈分析打包上传前端打包后端打包上传宝塔面板:配置数据库(Mysql)数据库导入数据数据库报错汇总报错提示:面板没有数据库显示报错提示:如果使用navicate等远程连接数据库失败配置Redis数据库配置小结宝塔面板:添加java项目日志检查宝塔面板:前端部署(Qu......
  • 如何高效规划时间?试试这6款日历工作软件!
    新年新气象,每个人的愿望清单里总有几条“变得更自律”、“高效完成工作”和“提升生活品质”。但实现这些目标,说起来简单,做起来却总被“时间管理”卡住!别急,想要从“拖延症晚期”转型为“时间管理达人”,你只需要一款好用的日历工作软件,帮你把新年的每一天都安排得井井有条!6款日历......
  • 多线程----互斥
    以下是关于多线程中互斥相关的详细知识点介绍以及C语言代码示例:一、互斥的概念与重要性在多线程编程中,多个线程可能会同时访问和操作共享资源(如全局变量、共享的数据结构等)。如果没有适当的控制机制,就可能导致数据不一致、程序逻辑错误等问题,这就是所谓的“线程安全”问题......
  • 全角转半角udf包
    /**Copyright2023tu.cnAllrightreserved.Thissoftwareisthe*confidentialandproprietaryinformationoftu.cn("Confidential*Information").YoushallnotdisclosesuchConfidentialInformationandshall*useitonlyinaccordancewit......
  • 在Android Studio中,通过设置腾讯镜像和代理解决无法下载gradle和gradle.plugin等组件
    诸神缄默不语-个人CSDN博文目录这个出现在刚打开项目的时候,下载一堆必要的组件……无法下载gradle的报错信息是:CouldnotinstallGradledistributionfrom'https://services.gradle.org/distributions/gradle-8.9-bin.zip'.Reason:java.net.SocketTimeoutException:......
  • LiteGBS国标GB28181平台接入的的摄像头图像模糊雾蒙蒙不清晰,如何处理?
    随着视频技术的不断进步,视频监控、直播、执法记录仪等多种视频资源的应用场景愈发广泛且多样化。这些视频资源不仅在数量上快速增长,更在质量、格式及编码标准等方面展现出极高的多样性。因此,为了实现对这些资源的有效整合和统一管理输出,信息化项目中对于视频综合接入能力的需求愈......