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

简单工厂模式

在这里插入图片描述

简介

简单工厂模式(Simple Factory Pattern)又叫作静态工厂方法模式(Static Factory Method Pattern),简单来说,简单工厂模式有一个具体的工厂类,可以生成多个不同的产品,属于创建型设计模式。简单工厂模式不在GoF 23种设计模式之列。

通用模板

  1. 创建抽象产品接口:是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口。

    // 抽象产品
    public interface IProduct {
        void doSomething();
    }
    
  2. 创建具体产品类:是简单工厂模式的创建目标。

    // 具体产品ProductA
    public class ProductA implements IProduct {
        public void doSomething() {
            System.out.println("ProductA...");
        }
    }
    
    
    // 具体产品ProductB
    public class ProductB implements IProduct {
        public void doSomething() {
            System.out.println("ProductB...");
        }
    }
    
  3. 创建简单工厂类:是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象。

    
    public  class SimpleFactory {
        public static final int PRODUCT_A = 0;
        public static final int PRODUCT_B = 1;
    
        public static IProduct makeProduct(int product) {
            switch (product) {
                case PRODUCT_A:
                    return new ProductA();
                case PRODUCT_B:
                    return new ProductB();
            }
            return null;
        }
    }
    

模板测试

  1. 代码

    public class Client {
        public static void main(String[] args) {
            IProduct iProduct = SimpleFactory.makeProduct(0);
            assert iProduct != null;
            iProduct.doSomething();
        }
    }
    
  2. 结果

    ProductA...
    

应用场景

  1. 当工厂类负责创建的对象比较少时:因为每增加一个产品就需要修改工厂类的判断逻辑,所以如果产品种类不多,可以考虑使用简单工厂模式。
  2. 客户端只知道传入工厂类的参数:客户端并不知道具体要创建哪一个类的对象,只负责传递相关的参数给工厂类。
  3. 具体产品类的创建算法相似:如果创建各种产品类的逻辑非常相似,那么可以通过一个简单的工厂方法来实现。

优点

  1. 封装性:简单工厂将对象的创建过程封装起来,使得客户端不需要关心具体对象的创建过程。
  2. 扩展性:当系统需要增加新的产品时,可以通过修改工厂类来实现,客户端代码不需要改变。
  3. 简化接口:对于客户端来说,只需要调用工厂类中的静态方法即可获取到所需的产品对象,这使得客户端代码更简洁。

缺点

  1. 不符合开闭原则:当增加新产品时,需要修改工厂类中的逻辑,这违反了“对扩展开放,对修改关闭”的原则。
  2. 判断逻辑集中:所有的判断逻辑都在工厂内部实现,如果产品种类较多,那么工厂会变得臃肿且难以维护。
  3. 类型安全问题:如果传给工厂的方法参数有误,可能会导致类型转换异常。

“生搬硬套”实战

场景描述

假设我们在做一个游戏,游戏中有不同的武器(Weapon),比如剑(Sword)、枪(Gun)。每种武器都有攻击的方法。我们需要在游戏中根据玩家的选择来创建相应的武器对象。

代码开发

我们知道使用简单工厂模式拢共就三步:

  1. 创建抽象产品(这里指武器)接口:

    // 武器接口
    public interface IWeapon {
        void attack();
    }
    
  2. 创建具体产品(就是剑、抢等武器)类:

    // 具体武器类-剑
    public class Sword implements IWeapon{
        public void attack() {
            System.out.println("用剑攻击!");
        }
    }
    
    
    // 具体武器类-枪
    public class Gun implements IWeapon{
        public void attack() {
            System.out.println("用枪攻击!");
        }
    }
    
  3. 创建简单工厂(这里指生产武器的工厂)类:

    
    public class WeaponFactory {
        public static final int WEAPON_SWORD = 0;
        public static final int WEAPON_GUN = 1;
    
        public static IWeapon createWeapon(int type) {
            switch (type) {
                case WEAPON_SWORD:
                    return new Sword();
                case WEAPON_GUN:
                    return new Gun();
            }
            return null;
        }
    }
    

至此,我们就通过“生搬硬套”简单工厂模式的模板设计出一套武器生产工厂,接下来我们进行测试:

  • 测试代码

    
    public class Client {
        public static void main(String[] args) {
            IWeapon weapon = WeaponFactory.createWeapon(0);
            assert weapon != null;
            weapon.attack();
        }
    }
    
  • 结果

    用剑攻击!
    

总结

对于产品种类相对较少的情况,考虑使用简单工厂模式可以很方便地创建所需产品。使用简单工厂模式的客户端只需要传入工厂类的参数,不需要关心如何创建对象的逻辑。


http://www.kler.cn/news/319206.html

相关文章:

  • SQL常用语法详解
  • SelMatch:最新数据集蒸馏,仅用5%训练数据也是可以的 | ICML‘24
  • 【深度学习】聊一聊正则化
  • C++之 string(中)
  • 1.1 elasticsearch分布式集群基本搭建(centos7.x + elaticsearch7.11.1)
  • 【代码随想录训练营第42期 Day60打卡 - 图论Part10 - Bellman_ford算法系列运用
  • 什么是集成学习?
  • 如何使用ssm实现基于VUE.js的在线教育系统+vue
  • Go调试工具—— Delve
  • 2024 ICPC ShaanXi Provincial Contest —— C. Seats(个人理解)拓扑+dfs
  • 深度学习(4):torch.nn.Module
  • flink 的 Barrier 对齐 的优劣详解:
  • PHP 中 empty() 函数的作用
  • PAT甲级-1083 List Grades
  • 如何选择渲染集群管理软件?
  • css基础知识笔记
  • 【Pyside】pycharm2024配置conda虚拟环境
  • Jmeter 线程组解析
  • 产品经理如何转到AI赛道?优势在哪?待遇如何?
  • C++系列-STL容器中统计算法count, count_if
  • uniapp调用安卓service实现后台运行
  • 华为OD机试真题-最少交换次数-2024年OD统一考试(E卷)
  • fastadmin前端切换成英文,后台中文,修改JS文件
  • Milvus - 从数据库到 Partition Key 实现多租户
  • STM32 使用 CubeMX 实现按键外部中断
  • flink 为啥使用MemorySegment 来管理内存
  • 性能测试1初步使用Jmeter
  • el-table中根据状态改单元格样式
  • 医学数据分析实训 项目五 分类分析--乳腺癌数据分析与诊断
  • mybatis-plus公共字段自动填充fillStrategy()方法和strictFill()方法