当前位置: 首页 > article >正文

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

设计模式的分类

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

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

在这里插入图片描述

设计模式系列文章传送门

设计模式的 7 大原则

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

什么是工厂方法模式

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

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

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

工厂方法的优缺点

优点

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

缺点:

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

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

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


http://www.kler.cn/a/449855.html

相关文章:

  • 链表的详解
  • Docker搭建kafka环境
  • 【uni-app】2025最新uni-app一键登录保姆级教程(包含前后端获取手机号方法)(超强避坑指南)
  • STM32HAL库中RTC闹钟设置时分秒,年月日
  • V900新功能-电脑不在旁边,通过手机给PLC远程调试网关配置WIFI联网
  • 网络管理 详细讲解
  • [vLLM vs TensorRT-LLM] :系统调度schedule比较
  • 浅谈算法交易
  • MySQL表名传参SP
  • Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
  • Windows开启IIS后依然出现http error 503.the service is unavailable
  • 使用 ffmpeg 拼接合并视频文件
  • 代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
  • 软考——RIP路由协议
  • 数据结构漫游记:静态链表的实现(CPP)
  • HTTP常见异常状态码
  • Android Bootable Recovery 中的 `bspatch.cpp` 文件详解
  • Tauri 开源 - 从零打造一款跨端的 AI 笔记
  • ubuntu 网络管理
  • Clickhouse 集群配置
  • Linux系统卡顿排查
  • PostgreSql+Pgpool-II配置高可用集群(超详细)
  • scrapy实战之新浪新闻爬虫
  • Linux 批量查找与替换的常用命令
  • C++中的字符串实现
  • ACl访问控制列表