• 工厂模式之工厂方法模式(常用)


    工厂方法模式   

            简单工厂模式违背了开闭原则,而工厂方法模式则是简单工厂模式的进一步深化,其不像简单工厂模式通过一个工厂来完成所有对象的创建,而是通过不同的工厂来创建不同的对象,每个对象有对应的工厂创建。

            定义:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

    工厂方法模式的结构  

     抽象工厂模式提供了一个接口,用于创建一系列相关或相互依赖的对象。通过使用抽象工厂接口及其具体实现,可以将对象的创建与客户端代码分离,从而实现系统的松耦合。抽象工厂模式涉及多个角色:

             抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法 newProduct() 来创建产品。
            具体工厂:主要实现抽象工厂中的抽象方法,完成具体产品的创建。
            抽象产品:定义了产品的规范,描述了产品的主要特性和功能。
            具体产品:实现了抽象产品角色所定义的接口,有具体工厂创建,它同具体工厂一一对应。

    一般使用场景

    • 调用方无需关注对象的创建过程,只需要直接调用即可。
    • 具体子类的数目不确定,后续可能会新增或者减少子类的数量。对子类的使用不确定
    • 调用方根据参数来调用对应的对象。

    简单实例代码

    1. // 定义一个图形接口
    2. interface Shape {
    3. void draw();
    4. }
    5. // 实现两个具体的图形类,分别是 Circle(圆形)和 Rectangle(矩形)
    6. class Circle implements Shape {
    7. @Override
    8. public void draw() {
    9. System.out.println("Drawing a circle");
    10. }
    11. }
    12. class Rectangle implements Shape {
    13. @Override
    14. public void draw() {
    15. System.out.println("Drawing a rectangle");
    16. }
    17. }
    18. // 创建一个抽象工厂类 ShapeFactory
    19. // 定义了一个抽象的工厂方法 createShape,子类将实现这个方法来创建具体的图形对象
    20. abstract class ShapeFactory {
    21. abstract Shape createShape();
    22. }
    23. // 创建两个具体的工厂类,分别是 CircleFactory 和 RectangleFactory
    24. // 它们分别实现了 ShapeFactory 并重写了 createShape 方法来返回相应的图形对象
    25. class CircleFactory extends ShapeFactory {
    26. @Override
    27. Shape createShape() {
    28. return new Circle();
    29. }
    30. }
    31. class RectangleFactory extends ShapeFactory {
    32. @Override
    33. Shape createShape() {
    34. return new Rectangle();
    35. }
    36. }
    37. // 使用这些工厂类来创建图形对象
    38. public class FactoryMethodExample {
    39. public static void main(String[] args) {
    40. ShapeFactory circleFactory = new CircleFactory();
    41. Shape circle = circleFactory.createShape();
    42. circle.draw();
    43. ShapeFactory rectangleFactory = new RectangleFactory();
    44. Shape rectangle = rectangleFactory.createShape();
    45. rectangle.draw();
    46. }
    47. }
  • 相关阅读:
    如何检查 Docker 和 Kubernetes 是否可以访问外部网络,特别是用于拉取镜像的仓库?
    Git创建、diff代码、回退版本、撤回代码,学废了吗
    linux001--初次体验vmware虚拟机
    华为云云耀云服务器L实例评测|企业项目最佳实践之私有库搭建verdaccio(八)
    nginx做白名单和限流
    算法优化,最短路径。
    go-bindata - embed结合嵌入静态文件打包可执行二进制文件
    内核网络协议栈传输层协议框架
    [机器学习] 通俗理解机器学习分类模型评估指标-准确率、精准率、召回率
    今天给在家介绍一篇基于jsp的旅游网站设计与实现
  • 原文地址:https://blog.csdn.net/qq_56751933/article/details/134502497