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

java设计模式-抽象工厂模式

时间:2024-06-19 22:22:23浏览次数:15  
标签:java 创建 工厂 抽象 产品 具体 设计模式 public

抽象工厂模式是一种创建一系列相关或相互依赖对象的设计模式。它通过定义一个抽象工厂接口,该接口声明了一组用于创建不同类型对象的方法,具体的工厂类实现这个接口并负责创建具体的对象。抽象工厂模式属于创建型模式的一种,可以帮助我们创建一族相关的对象。

抽象工厂模式主要解决的问题是在创建一系列相关对象时,需要保证这些对象之间的兼容性或一致性。它可以提供一种统一的方式来创建一组相关的产品对象,避免了直接在代码中使用具体的产品类,从而将对象的创建和使用解耦。

我们需要使用抽象工厂模式的时候,通常有以下情况:

当需要创建一组相关或相互依赖的对象时,可以使用抽象工厂模式来保证这些对象之间的兼容性或一致性。

当希望客户端代码与具体产品类解耦,只与抽象工厂接口进行交互时,可以使用抽象工厂模式。

当系统需要支持多个产品族的变化,但不希望客户端代码与具体产品类紧密耦合时,可以使用抽象工厂模式。

假设你是一家家具店的顾客,你可以购买整套的卧室家具或客厅家具。在这个例子中,家具店就是一个抽象工厂,它可以创建卧室家具和客厅家具两类产品。具体的家具店店铺(如宜家、欧诗漫等)则是具体的工厂类,分别负责创建自己品牌的卧室家具和客厅家具。顾客只需要与抽象工厂接口进行交互,而无需关心具体的工厂和产品类。

抽象工厂模式的优点包括:

提供了一种统一的方式来创建一系列相关的产品对象,保证了这些对象之间的兼容性或一致性。

客户端代码与具体产品类解耦,只与抽象工厂接口进行交互,易于扩展和维护。

支持多个产品族的变化,可以方便地切换产品族而无需修改客户端代码。

抽象工厂模式也有一些缺点:

当需要添加新的产品种类时,需要修改抽象工厂接口及所有的具体工厂类,扩展性较差。

增加新的产品族比较困难,需要修改抽象工厂接口及所有的具体工厂类。

适合使用抽象工厂模式的场景包括:

需要创建一系列相关或相互依赖的对象,并希望保证它们之间的兼容性或一致性。

希望客户端代码与具体产品类解耦,只与抽象工厂接口进行交互。

需要支持多个产品族的变化,但不希望客户端代码与具体产品类紧密耦合。

通过一个简单的代码示例来说明抽象工厂模式的使用:

// 抽象产品A
interface ProductA {
    void doSomething();
}

// 具体产品A1
class ConcreteProductA1 implements ProductA {
    public void doSomething() {
        System.out.println("Product A1");
    }
}

// 具体产品A2
class ConcreteProductA2 implements ProductA {
    public void doSomething() {
        System.out.println("Product A2");
    }
}

// 抽象产品B
interface ProductB {
    void doSomething();
}

// 具体产品B1
class ConcreteProductB1 implements ProductB {
    public void doSomething() {
        System.out.println("Product B1");
    }
}

// 具体产品B2
class ConcreteProductB2 implements ProductB {
    public void doSomething() {
        System.out.println("Product B2");
    }
}

// 抽象工厂
interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// 具体工厂1
class ConcreteFactory1 implements AbstractFactory {
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }

    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

// 具体工厂2
class ConcreteFactory2 implements AbstractFactory {
    public ProductA createProductA() {
        return new ConcreteProductA2();
    }

    public ProductB createProductB() {
        return new ConcreteProductB2();
    }
}

// 客户端代码
public class Client {
    private ProductA productA;
    private ProductB productB;

    public Client(AbstractFactory factory) {
        productA = factory.createProductA();
        productB = factory.createProductB();
    }

    public void doSomethingWithProducts() {
        productA.doSomething();
        productB.doSomething();
    }

    public static void main(String[] args) {
        AbstractFactory factory1 = new ConcreteFactory1();
        Client client1 = new Client(factory1);
        client1.doSomethingWithProducts();

        AbstractFactory factory2 = new ConcreteFactory2();
        Client client2 = new Client(factory2);
        client2.doSomethingWithProducts();
    }
}

在上面的代码中,我们定义了两个产品族:ProductA 和 ProductB。每个产品族有两个具体的产品实现。AbstractFactory 接口定义了创建产品的方法,具体的工厂类 ConcreteFactory1 和 ConcreteFactory2 分别实现了 AbstractFactory 接口,并负责创建自己的产品族。客户端代码 Client 在构造函数中接收一个抽象工厂对象,并使用该工厂对象创建产品,并通过这些产品进行操作。

通过这个示例,我们可以看到抽象工厂模式的使用方式和优势。客户端代码只需要与抽象工厂接口进行交互,具体的产品创建过程由具体工厂类负责,客户端代码与具体产品类解耦,可以方便地切换产品族。

标签:java,创建,工厂,抽象,产品,具体,设计模式,public
From: https://www.cnblogs.com/moon-v/p/18257595

相关文章

  • 【华为OD】D卷真题100分:IPv4地址转换成整数 Java代码实现
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客JS、python、java、C、C++代码实现:【华为OD】D卷真题100分:IPv4地址转换成整数JavaScript代码实现-CSDN博......
  • 初识java基础
    一、初识javaJava是一门面向对象的编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程......
  • Java项目开发中异步调用场景控制并发数
    场景项目基于SpringBoot搭建,默认使用TomcatWeb容器,对于每个HTTP请求,TomcatWeb容器会分配1个线程来处理请求。在pom.xml里查看依赖关系:spring-boot-starter-web添加了tomcat-embed-core依赖Tomcat线程池配置可在application.yml配置:server:tomcat:max-threads:5......
  • SEETF-2023 express-javascript-security ejs相关漏洞
    今天做个ejs相关题目。进入页面只发现一个输入框,题目标签是ejs相关,去github看看源码,发现ejs版本为3.1.9,可以确定地是rce漏洞。接下来说说这个rce漏洞。3.1.9版本的rce漏洞主要是因为使用了这个模板来构建网页逻辑导致的。点击查看代码//index.jsconstexpress=require('e......
  • 袈裟哥java程序语言终极版
    第一章:Java环境搭建    Java是一种计算机编程语言;除了java编程语言,还有很多的编程语言:c、c++、c#、python等不同编程语言类比于不同国家语言;每个编程语言的语法不同;应用场景不同Java是一个用于后端开发的编程语言 一、Java历史    1.1995年,sun公司推出的一款......
  • 持续总结中!2024年面试必问 20 道设计模式面试题(六)
    上一篇地址:持续总结中!2024年面试必问20道设计模式面试题(五)-CSDN博客十一、迭代器模式(IteratorPattern)解决了什么问题?迭代器模式(IteratorPattern)解决了如何顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示的问题。这种模式定义了一种方法来遍历集合,同时保持了对象......
  • 【JavaScript脚本宇宙】终极对决:JavaScript表单库比较指南
    简化你的表单开发:六种流行JavaScript库的深入比较前言在现代网页开发中,表单处理是一个常见的任务。为了简化这个过程并提供更好的用户体验,许多开发人员使用JavaScript库来管理表单数据、验证和提交。本文将介绍六种流行的JavaScript表单库,它们具有不同的功能和适用场景。......
  • 设计模式-利用状态机实现订单状态流转控制
    状态机是状态模式的一种应用,相当于上下文角色的一个升级版。在工作流和游戏中有大量使用。如各种工作流引擎,几乎是状态机的子集和实现,封装状态的变化规则。Spring也给我们提供了一个很好的解决方案。在spring中的组件名称就叫StateMachine。状态机简化状态控制的开发过程,让状态机......
  • 设计模式-命令模式
    命令模式命令模式是对命令的封装,每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式解耦了请求方与接收方,请求方只需要请求执行命令,不用关心命令时怎样被接收,怎样被操作以及是否被执行等。命令模式属于行为型模式。角色:接收者......
  • 设计模式-状态模式
    状态模式状态模式也成为状态机模式,是允许对象在内部状态发生改变时改变它的行为。对象看起来好像改变了它的类,属于行为型模式。角色:上下文角色(Context):定义客户端需要的接口,内部维护一个当前状态实例,并负责具体状态的切换。抽象状态角色(State):定义该状态下的行为,可以有一个或多......