首页 > 其他分享 >工厂方法模式(Factory Method Pattern)

工厂方法模式(Factory Method Pattern)

时间:2024-05-28 14:13:35浏览次数:13  
标签:Product Pattern Factory 工厂 抽象 Method 产品 具体 public

工厂方法模式(Factory Method Pattern)

是一种创建型设计模式,它在父类中提供一个创建对象的方法,允许子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行,使得系统在不修改原有代码的情况下可以扩展,从而实现了开闭原则(对扩展开放,对修改关闭)

模式结构

  1. 抽象工厂(Abstract Factory):声明了一个创建产品的抽象方法,由子类决定实现。
  2. 具体工厂(Concrete Factory):实现了抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品(Abstract Product):定义了产品的接口,是工厂方法模式所创建对象的超类型,也就是产品对象的共同父类或接口。
  4. 具体产品(Concrete Product):实现了抽象产品接口的具体产品。

工作原理

  1. 客户端调用抽象工厂中的工厂方法以获取所需产品的实例。
  2. 抽象工厂将具体产品的创建推迟到其子类(即具体工厂)中进行。
  3. 具体工厂根据需求创建并返回具体产品的实例。

优点

  1. 降低耦合度:客户端只需要知道所需产品的抽象接口,而不需要知道具体产品的类名,降低了客户端与具体产品之间的耦合度。
  2. 扩展性好:当需要添加新的产品时,只需要增加相应的具体产品类和具体工厂类,而不需要修改原有的代码,符合开闭原则。
  3. 隐藏实现细节:客户端只需要关注产品的抽象接口,而不需要关心产品的具体实现细节,降低了系统的复杂度。

缺点

  1. 增加了类的数量:由于需要为每个产品都提供一个具体的工厂类,因此会增加系统中类的数量。
  2. 增加了系统的复杂度:对于简单的场景,使用工厂方法模式可能会增加系统的复杂度,使得代码难以理解和维护。

应用场景

  1. 当一个类不知道它所必须创建的对象的类的时候。
  2. 当一个类希望由它的子类来指定它所创建的对象的时候。
  3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

实例代码

// 抽象产品  
public interface Product {  
    void use();  
}  
`
// 具体产品A  
public class ConcreteProductA implements Product {  
    @Override  
    public void use() {  
        System.out.println("使用产品A");  
    }  
}  

// 具体产品B  
public class ConcreteProductB implements Product {  
    @Override  
    public void use() {  
        System.out.println("使用产品B");  
    }  
}  
  
// 抽象工厂  
public abstract class AbstractFactory {  
    public abstract Product createProduct();  
}  
  
// 具体工厂A  
public class ConcreteFactoryA extends AbstractFactory {  
    @Override  
    public Product createProduct() {  
        return new ConcreteProductA();  
    }  
}  
  
// 具体工厂B  
public class ConcreteFactoryB extends AbstractFactory {  
    @Override  
    public Product createProduct() {  
        return new ConcreteProductB();  
    }  
}  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        AbstractFactory factoryA = new ConcreteFactoryA();  
        Product productA = factoryA.createProduct();  
        productA.use(); // 输出:使用产品A  
        AbstractFactory factoryB = newConcreteFactoryB();  

        Product productB = factoryB.createProduct();  
        productB.use(); // 输出:使用产品B  
    }  
}

标签:Product,Pattern,Factory,工厂,抽象,Method,产品,具体,public
From: https://www.cnblogs.com/zjjtt/p/18217831

相关文章

  • 抽象工厂模式(Abstract Factory)
    抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供了一种方式,将一组具有共同主题的单独的工厂封装起来,而不需要指定它们的具体类。抽象工厂模式允许客户端在不指定具体类的情况下创建一系列相互关联或相互依赖的产品族。模式结构抽象工厂模式包含以下角色:抽象......
  • mybatis异常: Invalid value type for attribute 'factoryBeanObjectType': java.lang
    问题描述:  springboot3.2.0版本以上编写mapper报错解决方案: 排查mybatilsplus自带的mybatils-spring,重新引入1<dependency>2<groupId>com.baomidou</groupId>3<artifactId>mybatis-plus-boot-starter</artifactId>4......
  • ServiceScopeFactory的使用方式
    上篇文章谈到在项目中遇到了一个问题,其实就是生命周期的问题,在构造函数的参数中使用了scope生命周期的服务,然后使用ServiceScopeFactory去解决这一问题,但是使用方式好像不太正确上篇文章说遇到了问题,ServiceScopeFactory使用方式好像不太正确,为什么?因为构造这个管道的原计划是针......
  • BeanFactory和FactoryBean区别
    BeanFactoryBeanFactory是SpringIoC容器的核心接口,它定义了IoC容器的基本功能,如管理应用程序组件之间的依赖关系。BeanFactory负责实例化、配置和组装bean。它提供了获取bean实例的方法,通常通过bean的名称或类型来获取。BeanFactory是SpringIoC容器最底层的实现......
  • idea启动报错:java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory
    文章目录一、问题二、解决方法一、问题问题描述:idea整合Mybatis-plus的时候,启动报错:java.lang.NoClassDefFoundError:org/mybatis/logging/LoggerFactory二、解决方法可能原因:仔细检查了一下,发现mybatis-spring-boot-starter的包和mybatis-plus-boot-starter的......
  • 反模式 DI anti-patterns
    反模式DIanti-patterns反模式DIanti-patterns一、一、反模式DIanti-patterns1.控制狂Controlfreak在程序设计中,"Controlfreak"(控制狂)通常指的是一种反模式,即过度控制和过度管理代码的设计和执行流程。这种情况下,程序员试图通过过度的控制和指令来达到对代码的绝......
  • Spring的BeanFactoryPostProcessor和BeanPostProcessor区别?
    1、BeanFactoryPostProcessor是用于在容器实例化Bean之前对Bean的配置信息进行修改的接口,它允许对BeanFactory进行后处理,比如修改BeanDefinition的属性值等。BeanFactoryPostProcessor是在Bean的实例化之前执行的,对BeanFactory进行配置。2、BeanPostProcessor是用于在Bean实......
  • Java报错:Missing ServletWebServerFactory bean,如何解决
    哈喽,大家好,我是木头左!一、问题的出现:Java报错:MissingServletWebServerFactorybean在Java开发过程中,经常遇到各种错误。有时,这些错误可能看起来微不足道,但它们可能会阻碍的开发进度。今天,要讨论的是一个非常常见的错误:java.lang.IllegalStateException:MissingServletWebSe......
  • Survey on Large Language Model-Enhanced Reinforcement Learning: Concept, Taxonom
    发表时间:2024文章要点:文章对LLM增强强化学习(LLM-enhancedRL)的现有文献进行了总结。在agent-environment交互的范式下,讨论LLM对RL算法的帮助。文章先给出LLM-enhancedRL的概念:themethodsthatutilizethemulti-modalinformationprocessing,generating,reasoning,etc.......
  • WPF ListBox thumbnails and image mvvm behavior CallMethodAction
    <Windowx:Class="WpfApp108.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......