• 第三章·简单工厂模式


    一、简单工厂模式概述

    简单工厂模式并不属于GoF的23种经典设计模式,但通常将它作为学习其他工厂模式的基础。

    简单工厂模式的定义
    定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。

    二、简单工厂模式结构与实现

    2.1 简单工厂模式结构

    简单工厂模式主要包含以下3个角色。
    1,Factory(工厂角色):工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有产品实例的内部逻辑;工厂类可以被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它的返回类型为抽象产品类型Product。

    2,Product(抽象产品角色):它是工厂类创建的所有对象的父类,封装了各种产品对象的共有方法,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个通用的工厂方法,因为所有创建的具体产品对象都是其子类对象。

    3,ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承类抽象产品角色,需要实现在抽象产品中声明的抽象方法

    2.2 简单工厂模式实现

    用一个demo栗子来看看是怎么样的实现。

    抽象产品类代码示例:

    public abstract class Shape {
    
        //绘制
        public abstract void draw();
    
        //擦除
        public abstract void erase();
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    具体产品类的代码示例:

    public class Circle extends Shape {
    
        @Override
        public void draw() {
            System.out.println("绘制圆形");
        }
    
        @Override
        public void erase() {
            System.out.println("擦除圆形");
        }
    }
    
    public class Rectangle extends Shape {
    
        @Override
        public void draw() {
            System.out.println("绘制长方形");
        }
    
        @Override
        public void erase() {
            System.out.println("擦除长方形");
        }
    }
    
    public class Triangle extends Shape{
    
        @Override
        public void draw() {
            System.out.println("绘制三角形");
        }
    
        @Override
        public void erase() {
            System.out.println("擦除三角形");
        }
    }
    
    • 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

    工厂类的代码示例:

    public class ShapeFactory {
    
        public static Shape createShape(String type) {
            Shape shape = null;
            if ("circle".equals(type)) {
                shape = new Circle();
            } else if ("rectangle".equals(type)) {
                shape = new Rectangle();
            } else if ("triangle".equals(type)) {
                shape = new Triangle();
            } else {
                throw new UnsupportedShapeException("不支持绘制的几何图形");
            }
            return shape;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    客户端的代码示例:

    public class Client {
    
        public static void main(String[] args) {
            //type由用户传入
            String type = "triangle";
            Shape shape = ShapeFactory.createShape(type);
            shape.draw();
            shape.erase();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    三、简单工厂模式优缺点与适用环境

    3.1 简单工厂模式优点

    1. 实现了对象创建和使用的分离。
    2. 客户端无需知道所创建的具体产品类的类名,只需要知道具体产品类所对应的参数即可。
    3. 通过引入配置文件,可以在不修改任何客户端代码的情况下,更换和增加新的具体产品类,在一定程度上提高了系统的灵活性。

    3.2 简单工厂模式缺点

    1. 工厂类集中了所有产品的创建逻辑,职责过重,一旦不能正常工作,整个系统都要收到影响。
    2. 使用简单工厂模式势必会增加系统中类的个数(引入新的工厂类),增加了系统的复杂度和理解难度。
    3. 系统扩展困的,一旦添加新的产品就不得不修改工厂逻辑,在产品类型较多时有可能造成工厂逻辑过于复杂,不利于系统的扩展和维护。
    4. 简单工厂模式由于使用了静态工厂方法,造成工厂角色无法形成基于继承的等级结构。

    3.3 简单工厂模式适用环境

    在以下情况下可以考虑使用简单工厂模式:

    1. 工厂类负责创建的对象比较少,由于创建的对象比较少,不会造成工厂方法中的业务逻辑太过复杂。
    2. 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。

    【参考文献】:
    本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。

    【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git

  • 相关阅读:
    Mysql 45讲学习笔记(三十六)临时表
    qt 文字滚动
    BSN-DDC基础网络DDC SDK详细设计五:官方合约BSN-DDC-1155
    FPGA时序约束01——基本概念
    汽车空调手动抽排、加注制冷剂的技术要点(R134a)
    php的加密方式汇总
    202211103-STM8S103F3P6无法下载程序报30200、30004、30006等错误的排查方案
    com.google.code:kaptcha-2.3.jar
    Mac“其他文件”存放着什么?“其他文件”的清理方法
    第5篇 熊猫烧香逆向分析(下)
  • 原文地址:https://blog.csdn.net/weixin_44143114/article/details/126494760