设计模式之工厂模式

简介: 本篇文章是设计模式专题的第三篇文章,我会将遇到的设计模式都一一总结在该专题下,我会把自己对每一种设计模式的感悟写下来,以及在实际工作中我们该如何去灵活应用这些设计模式,欢迎大家关注。本篇文章我们就来讲一讲,最为常用的工厂模式。

工厂模式的简单介绍

工厂模式是创建型模式之一,它主要的作用也是帮助我们创建对象。在工厂模式中,我们在创建对象时不会对用户暴露创建逻辑,并且是通过使用一个统一的接口来指向新创建的对象。

工厂模式又细分为三种:

  • 简单工厂模式

    简单工厂模式可谓是最简单最实用的设计模式,我们只需要通过调用工厂为我们提供的一个方法就可以创建对象。这样虽然简单,但是有一个大的弊端就是,当我们新增一个商品时,需要去修改工厂类的代码,才可以使其为我们生产新的商品。这样会违背我们的设计原则,对扩展开放,对修改关闭。

    简单工厂就像是,新增产品需要把工厂关闭,重新进行修建,修建完成后可能会影响之前产品的生产。

    image.png

  • 工厂方法模式

    工厂方法模式就是为了改善简单工厂无法很好的保证扩展性的升级版本,我们通过构建一个抽象工厂,每次增加产品时,只需要增加一个对应的工厂实现类即可。使其可以完美的进行扩展,不需要影响以前的代码。

    工厂方法就像是,新增产品时,只需要加一个新产品的车间,丝毫不会干预到旧产品的生产。

    image.png

  • 抽象工厂模式

    抽象工厂使得工厂模式可以支持产品族的创建,创建有层级关系的产品。

    为什么会产生抽象工厂呢?就是因为简单工厂和工厂方法模式只能针对一类产品进行生产,如果想要生产其它商品只能再建一个工厂。比如说我们的工厂生产的抽象产品为汽车,那么我们就这能生产出各种汽车,而无法生产摩托车。抽象工厂的诞生就使得我们的工厂即可以生产不同型号的汽车,又可以生产不同型号的摩托车,还可以生产不同型号的飞机。

    image.png

工厂模式的具体实现思路

  • 简单工厂模式

    • 创建产品的抽象类 (一种产品)
    • 创建产品的具体实现 (不同规格的产品)
    • 创建工厂为每一种产品的具体实现,提供一个创建方法 (只有一个车间)
  • 工厂方法模式

    • 创建产品的抽象类 (一种产品)
    • 创建产品的具体实现 (不同规格的产品)
    • 创建工厂的抽象类 (车间)
    • 为每一种产品创建一种工厂的实现类 (多个车间,每个车间生产一种规格的产品)
  • 抽象工厂模式

    • 创建产品的抽象类多个 (多种产品)
    • 为每一种产品的抽象类创建具体实现 (为每一种产品提供多种规格的产品)
    • 创建工厂的抽象类,提供多种产品的生产方式 (定义工厂可以生产的品类)
    • 创建工厂的实现类,让其可以生产不同品类,不同规格的产品 (生产不同品类,不同规格的产品的具体厂家)

工厂模式的具体实现方案

  • 简单工厂

    // 抽象产品
    public interface Product {
        void method();
    }
    // 产品A
    public class ProductA implements Product {
        public void method() {
            
        }
    }
    // 产品B
    public class ProductB implements Product {
        public void method() {
            
        }
    }
    // 工厂
    public class Factory {
        public Product createProduct(String productType) {
            if (productType.equalsIgnoreCase("A")) {
                return new ProductA();
            } else if(productType.equalsIgnoreCase("B")) {
                return new ProductB();
            }
            return null;
        }
    }
  • 工厂方法

    // 抽象产品
    public interface Product {
        void method();
    }
    // 产品A
    public class ProductA implements Product {
        public void method() {
            
        }
    }
    // 产品B
    public class ProductB implements Product {
        public void method() {
            
        }
    }
    // 抽象工厂
    public interface Factory {
        Product create();
    }
    // 工厂A
    public class FactoryA implements Factory {
        public Product create() {
            return ProductA();
        }
    }
    // 工厂B
    public class FactoryB implements Factory {
        public Product create() {
            return ProductB();
        }
    }
  • 抽象工厂

    // 抽象产品A
    public interface ProductA {
        void method();
    }
    // 产品A1
    public class ProductA1 implements ProductA {
        public void method() {
            
        }
    }
    // 产品A2
    public class ProductA2 implements ProductA {
        public void method() {
            
        }
    }
    // 抽象产品B
    public interface ProductB {
        void method();
    }
    // 产品B1
    public class ProductB1 implements ProductB {
        public void method() {
            
        }
    }
    // 产品B2
    public class ProductB2 implements ProductB {
        public void method() {
            
        }
    }
    // 抽象工厂
    public interface Factory {
        ProductA createProductA();
        ProductB createProductB();
    }
    // 工厂A
    public class FactoryA implements Factory {
        // 生产A产品
        public ProductA createProductA(String productType) {
            if (productType.equalsIgnoreCase("1")) {
                // 生产A产品规格为1的
                return new ProductA1();
            } else if(productType.equalsIgnoreCase("2")) {
                // 生产A产品规格为2的
                return new ProductA2();
            }
            return null;
        }
        // 生产B产品
        public ProductB createProductB(String productType) {
            if (productType.equalsIgnoreCase("1")) {
                return new ProductB1();
            } else if(productType.equalsIgnoreCase("2")) {
                return new ProductB2();
            }
            return null;
        }
    }
    // 工厂B
    public class FactoryB implements Factory {
        // 生产A产品
        public ProductA createProductA(String productType) {
            if (productType.equalsIgnoreCase("1")) {
                return new ProductA1();
            } else if(productType.equalsIgnoreCase("2")) {
                return new ProductA2();
            }
            return null;
        }
        // 生产B产品
        public ProductB createProductB(String productType) {
            if (productType.equalsIgnoreCase("1")) {
                return new ProductB1();
            } else if(productType.equalsIgnoreCase("2")) {
                return new ProductB2();
            }
            return null;
        }
    }

工厂模式的优缺点

  • 简单工厂模式

    优点

    • 一个调用者想创建一个对象,只要知道其名称就可以了。
    • 扩展性高,如果想增加一个产品,只要扩展一个产品类就可以。
    • 将产品的具体实现封装起来,调用者只关心产品的接口。
    • 相对其他工厂方法来讲,代码简洁

    缺点

    • 每次增加一个产品时,都需要增加一个具体类,使得系统中类的个数成倍增加
    • 系统耦合度高,每次都需要修改创建产品的方法,不满足开闭原则
  • 工厂方法模式

    优点

    • 一个调用者想创建一个对象,只要需要调用对应工厂的创建方法即可。
    • 扩展性高,如果想增加一个产品,只要扩展一个产品类和一个工厂类就可以。
    • 将产品的具体实现封装起来,调用者只关心产品的接口。
    • 完美的实现开闭原则

    缺点

    • 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加
    • 通过工厂模式创建对象复杂度会变高
  • 抽象工厂模式

    优点

    • 满足了产品族的创建。
    • 将产品的具体实现封装起来,调用者只关心产品的接口。

    缺点

    • 工厂模式的缺点它都有

工厂模式的适用场景

  • 简单工厂模式

    1. 工厂类负责创建的对象比较少,这样不会造成工厂方法中的业务逻辑太过复杂。
    2. 客户端需要传入工厂类不同的参数即可获得不同的产品,对于如何创建对象并不关心。
  • 工厂方法模式

    1. 客户端可以不知道它所创建对象的类。
    2. 需要经常对产品进行扩展的。
  • 抽象工厂模式

    1. 产品族的创建,有上下级关系的产品。

工厂模式总结

工厂模式有三种类型,每一种工厂模式都有它独特的特点,简单工厂模式和工厂方法模式应用场景相同,工厂方法模式的扩展性更好,也符合程序设计的开闭原则,但是需要创建大量的类,每添加一种商品都得对应的创建一个商品的具体实现和一个工厂的具体实现。抽象工厂更适合用在生产不同品类的产品,有层级关系的这种产品。

目录
相关文章
|
Java
从源码看异步任务计算FutureTask
大家是否熟悉FutureTask呢?或者说你有没有异步计算的需求呢?FutureTask就能够很好的帮助你实现异步计算,并且可以实现同步获取异步任务的计算结果。下面我们就一起从源码分析一下FutureTask。
140 0
|
算法
超实用的算法小技巧
本篇文章我们将介绍一些超级实用的算法小技巧,灵活使用这些算法小技巧可以帮助我们更好的解决遇到的问题,让我们的时间复杂度,空间复杂度大大降低,有效的提高我们的编程能力。
205 0
数组和指针的区别
下面的摘取的例子特别具有说明性: 以后再也不敢说指针和数组一样啦!
1004 0
|
2天前
|
云安全 数据采集 人工智能
古茗联名引爆全网,阿里云三层防护助力对抗黑产
阿里云三层校验+风险识别,为古茗每一杯奶茶保驾护航!
古茗联名引爆全网,阿里云三层防护助力对抗黑产
|
6天前
|
人工智能 中间件 API
AutoGen for .NET - 架构学习指南
《AutoGen for .NET 架构学习指南》系统解析微软多智能体框架,涵盖新旧双架构、核心设计、技术栈与实战路径,助你从入门到精通,构建分布式AI协同系统。
305 142
|
2天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
402 0
|
3天前
|
传感器 人工智能 算法
数字孪生智慧水务系统,三维立体平台,沃思智能
智慧水务系统融合物联网、数字孪生与AI技术,实现供水全流程智能监测、预测性维护与动态优化。通过实时数据采集与三维建模,提升漏损控制、节能降耗与应急响应能力,推动水务管理从经验驱动迈向数据驱动,助力城市水资源精细化、可持续化管理。
267 142
|
2天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
本文介绍RAG(检索增强生成)技术,结合Spring AI与本地及云知识库实现学术分析AI应用,利用阿里云Qwen-Plus模型提升回答准确性与可信度。
204 90
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践

热门文章

最新文章