首页 > 其他分享 >抽象工厂模式:创建高效强大的对象家族

抽象工厂模式:创建高效强大的对象家族

时间:2023-10-19 15:15:07浏览次数:40  
标签:高效 创建 模式 工厂 抽象 产品 new public

大家好,欢迎来到程序视点!今天要分享的是工厂模式的最后一种模式:抽象工厂模式

前言

在上一篇文章:设计模式之工厂方法模式 最后,我们通过示例展示了两个问题。归纳起来就是:

  • 每次增加一个产品时,都需要增加一个具体类和一个对象实现工厂。

随着产品类的增多,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

  • 对于某些可以形成产品族(一组产品)的情况处理比较复杂

由于工厂方法模式中,一个具体工厂类只生产一类具体的对象,导致相关的产品系列之间在组装匹配的时候出现问题。

当我们考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产时,就形成了抽象工厂模式的基本思想。

抽象工厂模式简介

抽象工厂模式,就是为了创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

这“一组相关或相互依赖的对象”来自不同的接口或抽象类。而这个抽象工厂要提供这些不同接口或抽象类的实例对象。

一个工厂提供多个实例对象,且这些实例间相互关联或相互依赖

抽象工厂模式,可以看做是工厂方法模式的升级版,从生产一个产品,到生产一系列的产品。

来看看抽象工厂模式包含的几个角色:

  • 产品族抽象工厂:用来声明生成抽象产品的方法。
  • 产品族工厂:专门生产一组相关的具体产品的工厂类。
  • 产品抽象类:工厂类能创建出来的所有产品类的抽象。它负责描述所有实例所共有的公共接口。(这里必须要一个抽象类,不然不能保证返回的不同的产品类属于同一个类型)
  • 产品类:工厂类创建出来的目标。它(们)是产品抽象类的具体实现。

示例

现在我们来修改之前“手机和电脑配对”的代码。

先来看下抽象工厂

public interface SameBrandFactory {
  public Phone createPhone();
  public Computer createComputer();
}

接着是工厂实现类:

华为品牌的工厂类:

public HuaweiFactory implements SameBrandFactory {
  public Phone createPhone() {
    return new HuaweiPhone();
  }
  
  public Computer createComputer() {
    return new HuaweiComputer();
  }
}

苹果品牌的工厂类:

public AppleFactory implements SameBrandFactory {
  public Phone createPhone() {
    return new ApplePhone();
  }
  
  public Computer createComputer() {
    return new AppleComputer();
  }
}

现在我们来测试下:

public class Test {
  public static void main(String[] args) {
    HuaweiFactory huaweiFactory = new HuaweiFactory();
    Phone phone1 = huaweiFactory.createPhone();
    Computer computer1 = huaweiFactory.createComputer();
    
    // 匹配
    match(phone1, computer1);
    
    AppleFactory appleFactory = new AppleFactory();
    Phone phone2 = appleFactory.createPhone();
    Computer computer2 = appleFactory.createComputer();
    
    // 匹配
    match(phone2, computer2);
  }
  
  public static void match(Phone p, Computer c) {
   System.out.println(p.info() + "===" + c.getName()) 
  }
}

输出:

我是华为手机===我是华为电脑

我是苹果手机===我是苹果电脑

看见了吗?同一个工厂出来的手机和电脑一定是匹配的!

抽象工厂模式总结

抽象工厂模式只有在新增一个类型的具体产品时才需要新增工厂实现类。它可以创建属于一类类型的多种具体产品。

当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。同时,使得系统结构更加稳定。

最后,需要给大家说明下抽象工厂模式中的“开闭原则”的倾斜性特点

在抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦。产品等级结构间的约束或关联性,会要求设计人员在设计之初就要考虑全面。

如果在设计完成之后向系统中增加新的产品等级结构,或删除已有的产品等级结构,那将会导致系统出现较大的修改,为后续维护工作带来诸多麻烦。

标签:高效,创建,模式,工厂,抽象,产品,new,public
From: https://www.cnblogs.com/tanggoahead/p/17774729.html

相关文章

  • Qt Quick 工程创建
    一、简介QtQuick是Qt框架中的一个模块,用于创建现代、响应式的用户界面。它基于QML(QtMeta-ObjectLanguage)语言和QtQuickControls库,提供了一种声明性的方式来构建用户界面。QtQuick的主要特点包括:QML语言:QML是一种基于JavaScript的声明性语言,用于描述用户界面的结构和行......
  • 动态创建log4net 实例
    https://www.cnblogs.com/-dawn/p/8598566.html 根据业务类型,动态的创建日志实例,将日志写到不同目录。常见的配置文件中统一配置,不能满足需求。引用log4netnuget安装命令: Install-Packagelog4net-Version2.0.8日志实例创建类我这里log实例的相关参数都是直接......
  • MySQL创建用户并授权指定数据库
    创建账号CREATEUSER'账号'@'%'IDENTIFIEDBY'密码';mysql8的话需要改一下加密方式ALTERUSER'账号'@'%'IDENTIFIEDWITHmysql_native_passwordBY'密码';创建数据库,必须要有库,不然无法绑定CREATEDATABASE数据库名;把数据库权限给用户GRANTSEL......
  • 律师必备软件Alpha系统,为专业律师提供高效解决方案!
        Alpha法律智能操作系统由iCourt开发,是一款集大数据、市场拓展、律所管理等功能于一体的智能操作系统,它旨在通过强大的法律科技赋能法律人,更快速地获取同类型案件的办理经验,进而减轻律师工作负担、提升工作效率。目前,这一系统业已成为了国内法律人士必备的软件工具。......
  • 如何高效地配对一堆袜子?
    内容来自DOChttps://q.houxu6.top/?s=如何高效地配对一堆袜子?昨天我在整理干净的衣服时,发现自己配对袜子的方法效率不高。我的做法是简单地搜索——拿起一只袜子,然后按照顺序“迭代”一堆袜子来找到它的配对。平均来说,这需要遍历n/2*n/4=n2/8的袜子。作为一名计算机科......
  • Generative AI 新世界 | 大模型参数高效微调和量化原理概述
    在上期文章,我们对比了在AmazonSageMaker上部署大模型的两种不同的部署方式。本期文章,我们将探讨两个目前大语言模型领域的开发者们都关注的两个热门话题:大型语言模型(LLM)的高效微调和量化。 微调大型语言模型允许开发者调整开源基础模型,从而提高特定领域任务的性能。接下来的......
  • 【Spring Boot+LogBack】高效记录日志,实现日志文件本地化保存!
    ......
  • TSINGSEE智慧港口可视化智能监管解决方案,助力港口码头高效监管
    一、方案背景全球经济一体化进程以及国际市场的不断融合,使得港口码头成为了大型货运周转中心,每天数以百计的大型货轮、数以千计的大型集装箱、数以万计的人员流动。港口作为货物、集装箱堆放及中转机构,具有昼夜不歇、天气多变、环境恶劣等特性,安全保卫工作显得更加重要。在如此异常......
  • Kafka高效文件存储设计特点
    Kafka把topic中一个parition大文件分成多个小文件段,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。通过索引信息可以快速定位message和确定response的最大大小。通过index元数据全部映射到memory,可以避免segmentfile的IO磁盘操作。通过索引文件稀疏存储,可以大......
  • 快速入门运维:成为一名高效运维工程师的关键步骤
    引言:运维(OperationsandMaintenance)是现代技术领域中至关重要的角色之一。而作为一名运维工程师,需要负责维护和管理软件系统、网络基础设施和服务器等关键组件。本篇博客将介绍如何快速入门运维,成为一名高效的运维工程师。学习基本概念和原理:在开始之前,了解运维的基本概念和原理......