• Java设计模式之简单工厂模式(不属于23种设计模式)


    1. 简单工厂模式(不属于23种设计模式)

    1.1 什么是简单工厂模式

    什么时候用工厂模式:如果一个类的构造函数有很多参数,然后该类在很多地方被实例化成对象(每个对象实例化的参数不一样)。当需要修改构造函数的参数时,同时需要修改各个实例化的对象,这样会很麻烦

    所以需要工厂提供统一的实例化对象(对象实例化的参数一样),而调用者只需告诉工厂需要什么即可

    定义:定义一个创建产品对象的工厂类,这满足“创建与使用相分离”的特点。如果要创建的产品不多,只要一个工厂类就可以完成,这种模式就叫“简单工厂模式”

    1.2 优缺点和应用场景

    优点

    • 客户端只需传递参数给工厂类,说需要什么产品即可
    • 工厂类根据参数判断创建什么样的产品,工厂和产品的职责区分明确

    缺点

    • 简单工厂模式的工厂类单一,负责所有产品的创建,职责过重。且工厂类代码非常臃肿,违背高聚合原则
    • 使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
    • 系统扩展困难,一旦增加新产品不得不修改工厂逻辑,违背了“开闭原则”
    • 简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构

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

    1.3 模式的结构与实现

    结构

    • 抽象产品(Product):是简单工厂创建的所有对象的父类,负责描述所有实例共有的公共接口
    • 具体产品(ConcreteProduct):是简单工厂模式的创建目标
    • 简单工厂(SimpleFactory):是简单工厂模式的核心,负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象

    实现

    public class SimpleFactoryTest {
    
        public static void main(String[] args) {
    
            SimpleFactory.makeProduct(1).show();       // 具体产品1显示
    
        }
    }
    
    // 抽象产品
    interface Product {
        public void show();
    }
    
    // 具体产品:Product1
    class ConcreteProduct1 implements Product {
        public void show() {
            System.out.println("具体产品1显示");
        }
    }
    
    // 具体产品:Product2
    class ConcreteProduct2 implements Product {
        public void show() {
            System.out.println("具体产品2显示");
        }
    }
    
    
    class SimpleFactory {
        public static Product makeProduct(int productNumber) {
            switch (productNumber) {
                case 1:
                    return new ConcreteProduct1();
                case 2:
                    return new ConcreteProduct2();
            }
            return null;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    权限管理之多租户隔离授权
    Linux如何设计一个线程池
    OpenAI Chat completion API 入门指南
    在RISC-V64架构的CV1811C开发板上应用perf工具进行多线程程序性能分析及火焰图调试
    5年测试工程师被裁后发出灵魂一问:不会自动化就要被看不起吗?
    会员生日提前了一天
    《C++ 并发编程实战 第二版》:条件变量唤醒丢失与虚假唤醒
    H-WORM家族远控木马分析与处置
    Spark - Task 与 Partition 一一对应与参数详解
    shell 字符串变量
  • 原文地址:https://blog.csdn.net/yy8623977/article/details/126404820