• 面向对象设计模式——工厂方法(Method Factory))


    工厂方法(Factory Method)是一种创建型设计模式,其主要目标是定义一个用于创建对象的接口,但将对象的实际创建过程延迟到子类中。这允许一个类在其实例化过程中根据需要使用子类的不同实现。

    以下是工厂方法设计模式的关键概念:

    1. 产品接口(Product Interface):这是由工厂方法创建的对象必须实现的接口或抽象类。产品接口定义了对象的方法,这些方法可以在不同类型的具体产品中共享。

    2. 具体产品(Concrete Product):这些是实现产品接口的具体类。每个具体产品类提供了对产品接口的具体实现。

    3. 工厂接口(Factory Interface):工厂接口定义了一个工厂方法,子类将实现这个方法来创建具体产品。这个接口通常包括一个或多个工厂方法。

    4. 具体工厂(Concrete Factory):这些是实现工厂接口的具体类。每个具体工厂类实现了工厂方法,该方法返回特定类型的具体产品实例。

    应用场景:

    1. 插件系统工厂方法模式可用于创建插件或扩展组件。不同的插件可以实现相同的接口,从而允许应用程序加载和使用它们。

    2. 数据库驱动程序:数据库连接的创建是一个常见的使用工厂方法的场景。不同的数据库供应商可以提供不同的数据库连接类,它们都实现了相同的接口,应用程序可以使用适当的工厂方法来创建连接对象。

    3. 日志记录器:在应用程序中使用不同类型的日志记录器是常见的。工厂方法可以用于创建文件日志记录器、数据库日志记录器等不同类型的日志记录器。

    4. UI控件库:创建UI控件库时,工厂方法可用于创建不同类型的UI控件,如按钮、文本框等。

    5. 加密算法:在加密应用中,不同的加密算法可以实现相同的加密接口。工厂方法可以用于选择和创建不同类型的加密算法。

    6. 图形库:在图形库中,工厂方法可用于创建不同类型的图形对象,如圆形、矩形、线条等。

    工厂方法模式的优势在于它将对象的创建过程与应用程序的其余部分分离,提供了松耦合,使得应用程序更易于维护和扩展。通过工厂方法,应用程序可以轻松支持新类型的产品或组件,而无需对现有代码进行修改。这使工厂方法成为构建灵活、可扩展应用程序的重要设计模式。
    假设我们正在构建一个企业级应用,该应用需要处理不同类型的文档。这里,我们使用工厂方法模式来创建不同类型的文档处理器。文档处理器可以是PDF文档处理器、Word文档处理器或HTML文档处理器。每个文档处理器都需要实现一个文档处理接口,同时有不同的实现逻辑。

    文档处理接口(DocumentProcessor):

    public interface DocumentProcessor {
        void openDocument(String document);
        void saveDocument();
    }
    
    • 1
    • 2
    • 3
    • 4

    具体产品 - PDF文档处理器(PDFDocumentProcessor):

    public class PDFDocumentProcessor implements DocumentProcessor {
        private String document;
    
        @Override
        public void openDocument(String document) {
            System.out.println("Opening PDF document: " + document);
            this.document = document;
        }
    
        @Override
        public void saveDocument() {
            System.out.println("Saving PDF document: " + document);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    具体产品 - Word文档处理器(WordDocumentProcessor):

    public class WordDocumentProcessor implements DocumentProcessor {
        private String document;
    
        @Override
        public void openDocument(String document) {
            System.out.println("Opening Word document: " + document);
            this.document = document;
        }
    
        @Override
        public void saveDocument() {
            System.out.println("Saving Word document: " + document);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    工厂接口(DocumentProcessorFactory):

    public interface DocumentProcessorFactory {
        DocumentProcessor createDocumentProcessor();
    }
    
    • 1
    • 2
    • 3

    具体工厂 - PDF文档处理器工厂(PDFDocumentProcessorFactory):

    public class PDFDocumentProcessorFactory implements DocumentProcessorFactory {
        @Override
        public DocumentProcessor createDocumentProcessor() {
            return new PDFDocumentProcessor();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    具体工厂 - Word文档处理器工厂(WordDocumentProcessorFactory):

    public class WordDocumentProcessorFactory implements DocumentProcessorFactory {
        @Override
        public DocumentProcessor createDocumentProcessor() {
            return new WordDocumentProcessor();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    现在,我们可以使用工厂方法模式创建不同类型的文档处理器,而无需直接实例化具体产品类。示例代码如下:

    public class Application {
        public static void main(String[] args) {
            // 使用PDF文档处理器
            DocumentProcessorFactory pdfFactory = new PDFDocumentProcessorFactory();
            DocumentProcessor pdfProcessor = pdfFactory.createDocumentProcessor();
            pdfProcessor.openDocument("sample.pdf");
            pdfProcessor.saveDocument();
    
            // 使用Word文档处理器
            DocumentProcessorFactory wordFactory = new WordDocumentProcessorFactory();
            DocumentProcessor wordProcessor = wordFactory.createDocumentProcessor();
            wordProcessor.openDocument("document.docx");
            wordProcessor.saveDocument();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    工厂方法模式的原理:

    • 定义一个抽象的工厂接口,该接口声明了创建产品的抽象方法。
    • 创建具体工厂类,每个工厂类实现了工厂接口,负责创建特定类型的产品。
    • 定义一个抽象产品接口或抽象类,声明产品的方法。
    • 创建具体产品类,每个产品类实现了抽象产品接口,提供产品的具体实现。
    • 在客户端代码中,使用工厂来创建产品,而不需要直接实例化具体产品。

    工厂方法模式的优劣点:

    优点:

    1. 松耦合:客户端代码与具体产品的类名分离,因此客户端不需要知道要创建哪种具体产品,从而实现了松耦合。
    2. 可扩展性:通过添加新的具体工厂和产品类,可以轻松扩展系统,而无需修改现有代码。
    3. 符合开闭原则:工厂方法模式符合开闭原则,因为它允许在不修改现有代码的情况下引入新产品。

    劣点:

    1. 类数量增加:引入了更多的类,每个具体产品都需要一个具体工厂类。在小规模系统中,这可能会导致类的数量增加。

    总的来说,工厂方法模式是一种非常有用的设计模式,尤其在需要创建多个相关对象时。它提供了一种灵活的方式来处理对象的创建,同时保持松耦合和可扩展性。

    工厂方法设计模式在java特性和spring特性中体现

    工厂方法设计模式在Java的特性和Spring框架中都有显著的体现。

    在Java中的体现:

    1. 接口和抽象类:工厂方法模式通常要求定义一个接口或抽象类,它声明了创建产品的抽象方法。这是Java的一项特性,可以用于定义工厂接口或工厂抽象类。

    2. 具体工厂类:在Java中,你可以创建具体工厂类,实现工厂接口或继承工厂抽象类,并在工厂方法中返回具体产品的实例。

    3. 具体产品类:每个具体产品类都实现了产品接口或继承产品抽象类,提供了产品的具体实现。

    4. 客户端代码:客户端代码使用工厂接口或抽象类来创建产品,而不需要直接实例化具体产品类。

    5. 多态:Java的多态性允许你在客户端代码中使用工厂创建产品,而无需关心具体产品的类型。

    // 工厂接口
    public interface ProductFactory {
        Product createProduct();
    }
    
    // 具体工厂类
    public class ConcreteProductFactory implements ProductFactory {
        @Override
        public Product createProduct() {
            return new ConcreteProduct();
        }
    }
    
    // 产品接口
    public interface Product {
        void doSomething();
    }
    
    // 具体产品类
    public class ConcreteProduct implements Product {
        @Override
        public void doSomething() {
            System.out.println("Doing something in ConcreteProduct.");
        }
    }
    
    // 客户端代码
    public class Client {
        public static void main(String[] args) {
            ProductFactory factory = new ConcreteProductFactory();
            Product product = factory.createProduct();
            product.doSomething();
        }
    }
    
    • 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

    在Spring框架中的体现:

    Spring框架广泛使用了工厂方法设计模式来创建和管理对象。以下是一些Spring框架中工厂方法模式的体现:

    1. Bean工厂:Spring容器是一个大型的Bean工厂,它负责创建、配置和管理应用程序中的Java对象(Bean)。在Spring中,Bean的创建是由Bean工厂或应用上下文(ApplicationContext)来管理的。这个工厂负责实例化、配置和组装Bean对象,然后将它们提供给应用程序。

    2. FactoryBean接口:Spring提供了FactoryBean接口,它允许你实现自定义的工厂类,用于创建和配置特定类型的Bean。FactoryBean接口要求实现getObject()方法,这个方法返回Bean的实例。通过实现FactoryBean接口,你可以在Spring容器中注册自定义的Bean工厂。

    public class MyFactoryBean implements FactoryBean<MyBean> {
        @Override
        public MyBean getObject() {
            return new MyBean();
        }
    
        @Override
        public Class<?> getObjectType() {
            return MyBean.class;
        }
    
        @Override
        public boolean isSingleton() {
            return true;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. @Bean注解:在Spring中,你可以使用@Bean注解在Java配置类中定义Bean的创建方法。这是一种工厂方法模式的实现,它告诉Spring如何创建和配置Bean。
    @Configuration
    public class MyConfiguration {
        @Bean
        public MyBean myBean() {
            return new MyBean();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    总之,工厂方法设计模式在Java和Spring框架中都有广泛的应用。它有助于将对象的创建和配置与客户端代码分离,实现了松耦合和可扩展性。在Spring中,工厂方法模式是Bean创建和管理的核心机制。

    如果有的宝宝还不理解,可以看看这个类比:

    当你需要制造一些产品,但这些产品来自不同的制造工厂,并且每种产品需要按照一定的标准制作,你可以使用工厂方法模式来管理制造过程。这就像在不同的工厂里制造汽车,每个工厂可以制造不同品牌的汽车,但都按照统一的汽车制造标准来生产。具体的解释如下:

    1. 产品接口: 这就是汽车的标准,例如汽车应该有轮子、发动机、座位等功能。汽车制造标准(产品接口)定义了汽车应该有哪些方法。

    2. 具体产品: 不同的汽车品牌如奔驰、宝马、奥迪等都是具体产品,它们必须遵守汽车制造标准,实现产品接口中定义的方法。

    3. 工厂接口: 这就是汽车工厂的标准,工厂应该有一个生产汽车的方法。汽车制造标准(工厂接口)定义了汽车工厂应该有哪些方法。

    4. 具体工厂: 奔驰工厂、宝马工厂、奥迪工厂等都是具体工厂,它们实现了工厂接口中的方法,根据标准制造对应品牌的汽车。

    工厂方法模式的意义在于,它允许你将产品的制造过程和产品本身解耦。你只需关心生产什么样的产品(产品接口),而不需要关心具体如何生产(具体产品),也不需要关心在哪里生产(具体工厂)。这提供了灵活性和可扩展性,使你能够轻松添加新产品或新工厂,而无需修改现有代码。

    所以,工厂方法模式的比喻是,你在制造汽车时,只需要关心汽车的标准和汽车工厂的标准,具体品牌的汽车是由对应的工厂来制造的。这种分离和标准化有助于管理和扩展你的制造过程。

  • 相关阅读:
    Vue3+Typescript学习笔记(八)脚手架VueCLi和Vite
    Linux从入门到实战 ---- 磁盘分区
    Python:操作SQLite数据库简单示例
    使用python监控linux服务器
    GPU加速Pinterest推荐模型,参数量增加100倍,用户活跃度提高16%
    正则表达式
    高空抛物检测方案设计(使用SOM进行轨迹分类)
    基于Java毕业设计法律知识分享平台源码+系统+mysql+lw文档+部署软件
    leetcode做题笔记131. 分割回文串
    1236 - 二分查找
  • 原文地址:https://blog.csdn.net/weixin_63958646/article/details/134047188