首页 > 其他分享 >抽象工厂模式(Abstract Factory)

抽象工厂模式(Abstract Factory)

时间:2024-05-28 14:12:30浏览次数:19  
标签:use Abstract Factory 工厂 抽象 产品 具体 public

抽象工厂模式(Abstract Factory Pattern)

是一种创建型设计模式,它提供了一种方式,将一组具有共同主题的单独的工厂封装起来,而不需要指定它们的具体类。抽象工厂模式允许客户端在不指定具体类的情况下创建一系列相互关联或相互依赖的产品族。

模式结构

抽象工厂模式包含以下角色:

  1. 抽象工厂(Abstract Factory):声明了一组用于创建一系列相关或相互依赖对象的操作接口。
  2. 具体工厂(Concrete Factory):实现了抽象工厂中定义的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品族都是由一组具有相同使用接口,但是由不同工厂实现的类所组成的。
  3. 抽象产品(Abstract Product):为每种产品声明接口,在抽象工厂中声明创建产品的接口。
  4. 具体产品(Concrete Product):实现抽象产品接口的具体类。
  5. 工作原理
  6. 抽象工厂模式主要是用于创建一组相关或相互依赖的对象,而无需指定它们的具体类。在抽象工厂模式中,客户端不直接与具体产品打交道,而是与抽象工厂和抽象产品打交道。客户端只需要知道所需产品的抽象类型,就可以通过抽象工厂创建具体的产品对象。

优点

  1. 封装性:客户端只需要知道所需产品的抽象类型,就能得到具体的产品对象,而无需知道具体产品的类名。
  2. 产品族内的约束:抽象工厂模式能够确保客户端始终只使用同一系列的产品。
  3. 易于交换产品系列:一个具体的工厂类能够在不修改任何客户端代码的情况下,返回与原产品系列功能相同但属于另一个不同产品系列的实例。

缺点

  1. 难以支持新种类的产品:每增加一个新的产品族,就需要增加一个具体工厂类,这可能会导致系统类的个数大量增加,从而增加系统的复杂性。
  2. 难以扩展增加新的产品:对于每一个产品族,都需要增加相应的具体产品类和抽象产品接口,这同样会增加系统的复杂性。
  3. 应用场景
  4. 当需要创建的对象是一系列相互关联或相互依赖的产品族时。
  5. 当系统中有多于一个的产品族,而每次只使用其中某一产品族时。
  6. 当系统提供一个产品类的库,并且只想显示它们的接口而不是实现时。
  7. 当系统的产品有多于一个的变种,而系统的配置需要由消费这些产品的外部决定时。

示例代码(Java)

// 抽象产品A  
public interface ProductA {  
    void use();  
}  
  
// 抽象产品B  
public interface ProductB {  
    void use();  
}  
  
// 具体产品A1  
public class ConcreteProductA1 implements ProductA {  
    @Override  
    public void use() {  
        System.out.println("使用产品A1");  
    }  
}  
  
// 具体产品B1  
public class ConcreteProductB1 implements ProductB {  
    @Override  
    public void use() {  
        System.out.println("使用产品B1");  
    }  
}  
  
// 具体产品A2  
public class ConcreteProductA2 implements ProductA {  
    @Override  
    public void use() {  
        System.out.println("使用产品A2");  
    }  
}  
  
// 具体产品B2  
public class ConcreteProductB2 implements ProductB {  
    @Override  
    public void use() {  
        System.out.println("使用产品B2");  
    }  
}  
  
// 抽象工厂  
public interface AbstractFactory {  
    ProductA createProductA();  
    ProductB createProductB();  
}  
  
// 具体工厂1  
public class ConcreteFactory1 implements AbstractFactory {  
    @Override  
    public ProductA createProductA() {  
        return new ConcreteProductA1();  
    }  
  
    @Override  
    public ProductB createProductB() {  
        return new ConcreteProductB1();  
    }  
}  
  
// 具体工厂2  
public class ConcreteFactory2 implements AbstractFactory {  
    @Override  
    public ProductA createProductA() {  
        return new ConcreteProductA2();  
    }  
  
    @Override  
    public ProductB createProductB() {  
        return new ConcreteProductB2();  
    }  
}  
  
// 客户端代码  
public class Client {  
    public static void main(String[] args) {  
        AbstractFactory factory1 = new ConcreteFactory1();  
        ProductA productA1 = factory1.createProductA();  
        ProductB productB1 = factory1.createProductB();  
        productA1.use(); // 输出:使用产品A1  
        productB1.use(); // 输出:使用产品

标签:use,Abstract,Factory,工厂,抽象,产品,具体,public
From: https://www.cnblogs.com/zjjtt/p/18217875

相关文章

  • 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......
  • HITSC_6_Abstract Data Type (ADT)
    AbstractionandUser-DefinedTypes......
  • ServiceScopeFactory的使用方式
    上篇文章谈到在项目中遇到了一个问题,其实就是生命周期的问题,在构造函数的参数中使用了scope生命周期的服务,然后使用ServiceScopeFactory去解决这一问题,但是使用方式好像不太正确上篇文章说遇到了问题,ServiceScopeFactory使用方式好像不太正确,为什么?因为构造这个管道的原计划是针......
  • BeanFactory和FactoryBean区别
    BeanFactoryBeanFactory是SpringIoC容器的核心接口,它定义了IoC容器的基本功能,如管理应用程序组件之间的依赖关系。BeanFactory负责实例化、配置和组装bean。它提供了获取bean实例的方法,通常通过bean的名称或类型来获取。BeanFactory是SpringIoC容器最底层的实现......
  • 抽象代数学习笔记(环论、域论)
    RingTheory4.8Definition:Aring\(R\)isasettogetherwithtwobinaryoperationtogetherwith"\(+\)"and"\(\times\)",obeying:\((R,+)\)isanAbeliangroup.\(\times\)isassociative:\((a\timesb)\timesc=a\ti......
  • 23种设计模式之抽象工厂模式
    抽象工厂模式工厂方法模式存在一个工厂只能创建一个具体产品类的问题,所以需要一种工厂可以提供多种产品对象,这就是抽象工厂模式。1、定义抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类产品等级结构和产品族首先要引入两个概念产品等......
  • 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的......
  • 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......
  • 记一次有点抽象的渗透经历
    0x01获取webshell在各种信息搜集中,发现某个ip的端口挂着一个比较老的服务。首先看到了员工工号和手机号的双重验证,也不知道账号是什么结构组成的,基本上放弃字典爆破这一条路。于是乎打开之前用灯塔的扫描结果,看看文件泄露是否有什么可用的点。发现其中有一个略显突出的help.ht......