• 三、工厂方法模式


    1、基本概念

    工厂方法模式属于GoF23中设计模式之一,也是创建型设计模式,工厂方法模式的出现可以解决产品类别进行扩展或者缩减时需要修改工厂类的问题,工厂方法模式在一定程度上比简单工厂模式更加符合开闭原则。
    工厂方法模式将工厂类进行了抽象,在简单工厂模式中,只有一个简单工厂类,该简单工厂类并没有向上形成任何抽象,而工厂方法模式通过对工厂本身提供一个抽象层,并在该抽象层中定义了一个抽象的产品创建方法,子类工厂通过实现该方法完成具体产品的创建,该抽象方法也就是工厂方法。
    工厂方法模式将对象的创建延迟到子类中进行,客户端只需要依赖抽象级别的工厂和抽象的产品类,在需要创建某个具体的产品的时候,只需要传入一个具体工厂类对象到客户端中即可,借助工厂方法模式可以实现产品类别扩展和缩小的时候只需要新增代码,而对原有代码的改动是极小的,可以很好的符合开闭原则和单一职责原则(后续会说明为什么)。

    2、工厂方法模式角色

    工厂方法模式中包含如下几个角色:

    1. 抽象产品类,提供了工厂方法需要创建的产品的上层抽象,面向接口编程的需要。
    2. 具体产品类,工厂方法中加工创建的对象。
    3. 抽象的工厂类,该类是所有具体工厂类的顶级父类,提供了一个创建产品的接口,但是没有给出实现,具体产品的创建过程,需要由子类来实现。
    4. 具体工厂类,继承自抽象的工厂类,并实现具体产品的创建步骤,在工厂方法模式中,一个具体工厂类只负责一个具体产品的创建,相比简单工厂来说,这很好的符合单一职责原则。
    5. 客户端类,依赖抽象的工厂以及抽象的产品,完成业务逻辑。

    3、工厂方法模式类图

    在这里插入图片描述

    4、代码实现

    1. AbstractProduct
    package factorymethod;
    
    public abstract class AbstractProduct {
        public abstract String getProductUsage();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. ConcreteProduct
    package factorymethod;
    
    public class ConcreteProductA extends AbstractProduct {
    
        @Override
        public String getProductUsage() {
            return "ConcreteProductA的使用方法";
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    package factorymethod;
    
    public class ConcreteProductB extends AbstractProduct {
    
        @Override
        public String getProductUsage() {
            return "ConcreteProductB的用法";
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. AbstractFactory
    package factorymethod;
    
    public abstract class AbstractFactory {
        public abstract AbstractProduct createProduct();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. ConcreteFactory
    package factorymethod;
    
    public class ConcreteProductAFactory extends AbstractFactory {
    
        @Override
        public AbstractProduct createProduct() {
            return new ConcreteProductA();
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    package factorymethod;
    
    public class ConcreteProductBFactory extends AbstractFactory {
    
        @Override
        public AbstractProduct createProduct() {
            return new ConcreteProductB();
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    1. Client
    package factorymethod;
    
    public class Client {
        public static void main(String[] args) {
            AbstractFactory factory = new ConcreteProductAFactory();
            AbstractProduct product = factory.createProduct();
            System.out.println(product.getProductUsage());
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5、工厂方法模式的优缺点

    1. 优点

    在工厂方法模式中,新增一个产品类只需要两步,第一步实现抽象产品的方法,第二步实现抽象的工厂,完成具体产品的创建。无需改动现有的工厂类的代码,因此工厂方法模式很好的解决了简单工厂模式中,因此产品类扩展,而导致的工厂类代码的修改问题,很好的遵守了开闭原则。同时在工厂方法模式中一个工厂类只负责创建一个产品对象,而简单工厂模式中,简单工厂负责创建多个产品对象,因此工厂方法模式相较于简单工厂模式更遵守单一职责原则。

    1. 缺点

    工厂方法模式的缺点就是每次增加一个产品类就需要增加一个对应的工厂类,如果产品类非常多,那么工厂类也会随之变多,这会导致类的维护变得困难,导致代码量变多。

  • 相关阅读:
    C++高级编程: 可调用对象
    VS中展开和折叠代码
    YoloV8改进策略:全新特征融合模块AFPN,更换YoloV8的Neck
    直播带货用什么成交话术可以提高销量
    Android  JetPack~ ViewModel (一)   介绍与使用
    【蓝桥杯大赛】简单回忆一下我的蓝桥杯比赛历程
    未来职业发展规划
    【组件】Vue组件之间的通信父传子 | 子传父
    golang的垃圾回收算法之五GMP模型
    开源浏览器引擎对比与适用场景:WebKit、Chrome、Gecko
  • 原文地址:https://blog.csdn.net/xichengfengyulou/article/details/127658534