首页 > 编程语言 >java 抽象工厂模式

java 抽象工厂模式

时间:2024-02-14 12:55:05浏览次数:30  
标签:java ProductB 工厂 具体 产品 抽象 public

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式来封装一组具有共同主题的单个工厂,而不需要指定它们的具体类。在抽象工厂模式中,每个工厂都负责创建一组产品(通常是一系列产品或产品线),这些产品通常相互关联或有某种约束。

在Java中实现抽象工厂模式,你通常会定义以下几个部分:

  1. 抽象产品接口(Abstract Product):定义产品的通用接口或抽象类。

  2. 具体产品类(Concrete Product):实现抽象产品接口的具体产品类。

  3. 抽象工厂接口(Abstract Factory):声明创建抽象产品的工厂方法。

  4. 具体工厂类(Concrete Factory):实现抽象工厂接口,负责创建具体产品。

下面是一个简单的Java代码示例,展示了如何使用抽象工厂模式:

// 抽象产品接口 A  
public interface ProductA {  
    void use();  
}  
  
// 具体产品类 A1  
public class ConcreteProductA1 implements ProductA {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品A1");  
    }  
}  
  
// 具体产品类 A2  
public class ConcreteProductA2 implements ProductA {  
    @Override  
    public void use() {  
        System.out.println("使用具体产品A2");  
    }  
}  
  
// 抽象产品接口 B  
public interface ProductB {  
    void eat();  
}  
  
// 具体产品类 B1  
public class ConcreteProductB1 implements ProductB {  
    @Override  
    public void eat() {  
        System.out.println("使用具体产品B1");  
    }  
}  
  
// 具体产品类 B2  
public class ConcreteProductB2 implements ProductB {  
    @Override  
    public void eat() {  
        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();  
        productB1.eat();  
  
        AbstractFactory factory2 = new ConcreteFactory2();  
        ProductA productA2 = factory2.createProductA();  
        ProductB productB2 = factory2.createProductB();  
        productA2.use();  
        productB2.eat();  
    }  
}

  

在这个例子中,我们有两个抽象产品接口ProductAProductB,它们各自有两个具体实现ConcreteProductA1ConcreteProductA2ConcreteProductB1ConcreteProductB2。我们还定义了一个抽象工厂接口AbstractFactory,它声明了创建产品A和产品B的工厂方法。然后,我们有两个具体工厂类ConcreteFactory1ConcreteFactory2,它们分别负责创建产品A1和产品B1,以及产品A2和产品B2。

客户端代码使用具体工厂来创建具体产品,而不需要了解这些产品的具体实现细节。这种方式使得系统更加灵活,容易扩展和修改,因为你可以在不修改客户端代码的情况下增加新的工厂和产品。

标签:java,ProductB,工厂,具体,产品,抽象,public
From: https://www.cnblogs.com/quguicai/p/18015144

相关文章

  • 【常见java错误】arthas的使用、常用命令
    arthas的使用arthas是一款强大的Java诊断工具,可以帮助开发者快速定位和解决Java应用程序中的问题。本文将介绍arthas的基本使用方法,包括安装、启动、基本命令和高级功能。一、安装arthas1.1Windows系统在Windows系统中,可以通过以下步骤安装arthas:访问arthas的GitHub发布页......
  • JAVA并发之PriorityBlockingQueue
    PriorityBlockingQueue(优先阻塞队列)是Java并发包java.util.concurrent下面的一个工具类,它除了具有阻塞队列的功能外还具有以下特点:对队列中的元素进行排序,如果未指定比较器,插入队列的元素必须实现Comparable接口内部基于数组实现的最小二叉堆算法队列的长度是可扩展的(类似Ar......
  • 通过解析库探究函数式抽象代价
    前因在春节前了解到Rust语言有一个叫nom的解析库它可以让你创建安全的解析器,而不会占用内存或影响性能。它依靠Rust强大的类型系统和内存安全来生成既正确又高效的解析器,并使用函数,宏和特征来抽象出容易出错的管道。nom核心是解析器组合器,而解析器组合器是高阶函数,可以......
  • 线程池工作流程 工厂流水线打比方
    线程池工作原理关于线程池的工作原理,我用下面的7幅图来展示。1.通过execute方法提交任务时,当线程池中的线程数小于corePoolSize时,新提交的任务将通过创建一个新线程来执行,即使此时线程池中存在空闲线程。2.通过execute方法提交任务时,当线程池中线程数量达到corePoolSize时,新......
  • Java基础
    java基础一、注释二、标识符和关键字关键字:标识符Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。标识符注意点:所有的标识符都应以字母(A-Z或者a-z),美元符($)、或者下划线(_)开始首字符之后可以是字母(A-Z或者a-z),美元符($)、下划线(_)或数字的任何字符组合......
  • JDK21报错 java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTre
    JDK21报错java:java.lang.NoSuchFieldError:Classcom.sun.tools.javac.tree.JCTree$JCImportdoesnothavememberfield'com.sun.tools.javac.tree.JCTreequalid'Lombok版本兼容性的问题导致Maven依赖改为新版本<dependency><groupId>org.projectlombok&l......
  • javacv模块依赖简化
    前言JavaCV更新到1.5.x版本,依赖包也迎来了很大变化,体积也变大了不少。由于javacv跨平台,那么全部javacv依赖包下载下来后,整个javacv的包会特别巨大,接近1G.显然很多平台依赖包我们并不需要,而且我们开发时只需要自己本身开发平台的依赖包就可以了JavaCV1.5.x和之前版本已经不兼容J......
  • p5js: JavaScript 创意绘画
    p5js是一个免费开源的Javascript创意绘画工具,通过p5js可以实现代码绘画01鼠标变色鼠标触发绘画区域,即马上变色,松开恢复functionsetup(){createCanvas(400,400);//设置画布大小}functiondraw(){if(mouseIsPressed)//被鼠标触发{background(255,51,......
  • Java与SpringBoot网站的重构
    Java简介Java特点: Java的运行原理: SpringBoot网站的重构有源码的情况后台重构(mysql+maven+jdk+网站源码)将网站源码放入idea软件中查看重要配置文件:pom.xml和application.propertiespom.xml有网站的jdk版本和打包软件而application.properites文件中有着数据库的配......
  • Oracle Java SE Product Releases
    1.gotothemainpage[https://www.oracle.com/]2.thenclick'Products'tochoosetheJavaicon3.clickthe'OracleJavaSEPlatform'icon[https://www.oracle.com/java/]4.repeattheactionasbelow[https://www.oracle.com/java/t......