首页 > 其他分享 >23种设计模式之抽象工厂模式

23种设计模式之抽象工厂模式

时间:2024-05-26 21:31:46浏览次数:16  
标签:run 嗖嗖 23 工厂 抽象 产品 设计模式 public

抽象工厂模式

工厂方法模式存在一个工厂只能创建一个具体产品类的问题,所以需要一种工厂可以提供多种产品对象,这就是抽象工厂模式。

1、定义

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类

产品等级结构和产品族

首先要引入两个概念

  • 产品等级结构:即产品的继承结构
  • 产品族:在抽象工厂模式中,产品族是指由同一个工厂生成的位于不同产品等级结构中的一组产品
    产品族与产品等级结构示意图

2、抽象工厂模式结构

  • AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,一个方法对应一种产品
  • ConcreteFactory(具体工厂):实现抽象工厂方法,生成一组具体产品,这些产品构成一个产品族
  • AbstractProduct(抽象产品):产品声明接口,声明了产品所有具体的业务方法
  • ConcreteProduct(具体产品):实现抽象产品方法,定义具体工程生产的具体产品对象
    抽象工厂模式结构图

3、实例代码

AbstractFactory

定义抽象工厂类IAnimalFactory

public interface IAnimalFactory {

    ICat createCat();

    IDog createDog();
}

ConcreteFactory

创建抽象工厂类的两个实现类,WhiteAnimalFactory和BlackAnimalFactory

public class BlackAnimalFactory implements IAnimalFactory{
    @Override
    public ICat createCat() {
        return new BlackCat();
    }

    @Override
    public IDog createDog() {
        return new BlackDog();
    }
}
public class WhiteAnimalFactory implements IAnimalFactory{
    @Override
    public ICat createCat() {
        return new WhiteCat();
    }

    @Override
    public IDog createDog() {
        return new WhiteDog();
    }
}

AbstractProduct

定义抽象工厂中要生产的抽象产品接口ICat和IDog

public interface ICat {

    void run();
}
public interface IDog {

    void run();
}

ConcreteProduct

创建产品的实现类BlackCat、BlackDog、WhiteCat、WhiteDog

public class BlackCat implements ICat{
    @Override
    public void run() {
        System.out.println("一只黑猫嗖嗖嗖嗖");
    }
}
public class WhiteCat implements ICat {

    @Override
    public void run() {
        System.out.println("一只白猫嗖嗖嗖嗖");
    }
}
public class BlackDog implements IDog{
    @Override
    public void run() {
        System.out.println("一只黑狗嗖嗖嗖嗖");
    }
}
public class WhiteDog implements IDog{
    @Override
    public void run() {
        System.out.println("一只白狗嗖嗖嗖嗖");
    }
}

编写一个测试类Client

public class Client {

    public static void main(String[] args) {
        IAnimalFactory blackAnimalFactory = new BlackAnimalFactory();
        ICat blackCat = blackAnimalFactory.createCat();
        IDog blackDog = blackAnimalFactory.createDog();
        blackDog.run();
        blackCat.run();

        IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory();
        ICat whiteCat = whiteAnimalFactory.createCat();
        IDog whiteDog = whiteAnimalFactory.createDog();
        whiteCat.run();
        whiteDog.run();
    }
}
一只黑狗嗖嗖嗖嗖
一只黑猫嗖嗖嗖嗖
一只白猫嗖嗖嗖嗖
一只白狗嗖嗖嗖嗖

4、抽象工厂模式优缺点

4.1优点
  • 抽象工厂模式隔离了具体类的生成。所有的具体工厂都实现了抽象工厂中定义的公共接口,因此只需要改变具体工厂的实例就可以在某种程度上改变整个系统的行为
  • 一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象(将一个系列的产品统一一起创建)
  • 增加新的产品族,无需改变已有系统,符合开闭原则
4.2缺点
  • 增加新的产品等级结构会很麻烦,需对原有系统做较大的修改,甚至需要修改抽象层代码,违背开闭原则

5、抽象工厂模式适用环境

  • 一系列相关产品对象(属于同一产品族)一起创建时需要大量的重复代码
  • 产品等级结构稳定,设计完成后尽可能的不会向系统中增加或删除等级结构
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时
  • 一个系统要独立于它的产品的创建、组合和表示时。

标签:run,嗖嗖,23,工厂,抽象,产品,设计模式,public
From: https://blog.csdn.net/qq_38811830/article/details/139220862

相关文章

  • 【嵌入式DIY实例】-OLED显示DS1307/DS3231实时时钟
    OLED显示DS1307/DS3231实时时钟文章目录OLED显示DS1307/DS3231实时时钟1、DS1307/DS1321介绍2、硬件准备3、代码实现本文将展示了如何使用ESP8266NodeMCU开发板、DS3231RTC芯片和SSD1306OLED显示屏(128×64像素)构建实时时钟。DS3231RTC有一个内置......
  • 每日一题——Python实现PAT甲级1023 Have Fun with Numbers(举一反三+思想解读+逐步优
    一个认为一切根源都是“自己不够强”的INTJ个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数目录我的写法:​编辑代码点评:代码功能时间复杂度空间复杂度优化建议哲学和编程思想举一反三题目链接我的写法:num=input()digits_in......
  • 【机器学习-23】关联规则(Apriori)算法:介绍、应用与实现
    在现代数据分析中,经常需要从大规模数据集中挖掘有用的信息。关联规则挖掘是一种强大的技术,可以揭示数据中的隐藏关系和规律。本文将介绍如何使用Python进行关联规则挖掘,以帮助您发现数据中的有趣模式。一、引言1.简要介绍关联规则学习的概念和重要性关联规则学习是一种......
  • SAP S4HANA2023 PCE系统上的VKM3?
    SAPS4HANA 2023PCE系统上的VKM3?  在SAPS4HANA2023PCE系统上,试图执行事务代码VKM3,为某个销售订单释放客户信用冻结,系统报错:无法执行事务VKM3(SAPNote2476734),     详细报错信息: 无法执行事务VKM3(SAPNote2476734)消息编号00977诊断系统配置(黑......
  • 【设计模式】迭代器模式 ——详解Iterator、foreach与for循环的区别
    参考:B站UP主动力节点迭代器模式定义:提供方法,顺序访问集合对象中的各个元素,而又不暴露对象的内部表示。为遍历不同的集合结构提供统一的接口,分离了集合对象的遍历行为。tips:Iterator迭代器本身就是JDK按照该模式设计的迭代器,通常情况下,我们都是直接使用JDK提供的。此处......
  • 【设计模式】代理模式——详解静态代理&动态代理
    内容由B站UP主动力节点产出,本文仅作为学习笔记代理模式定义:为对象提供一种代理,以控制这个对象的访问操作。代理对象和目标对象之间起到中介的作用。作用:保护目标对象和增强目标对象举例说明,以一个订单对象为例:classOrder{ privateStringinfo; privateStringus......
  • 设计模式 1 (Python版)
    设计模式解释:概念《设计模式:可复用面向对象软件的基础》面向对象的特性:封装,继承,多态接口:若干方法的集合限制实现接口的类必须按照接口给定的调用方式实现这些方法对高层模块隐藏了类的内部实现#接口实现的两种方法:#1.写一个父类,其他类必须继承这个方法,若子类不实现这......
  • 【数据分享】仙桃市统计年鉴(2011-2023)
    大家好!今天我要向大家介绍一份重要的仙桃市统计数据资源——《仙桃市统计年鉴》。这份年鉴涵盖了从2011年到2023年仙桃市统计全面数据,并提供限时免费下载。(无需分享朋友圈即可获取)数据介绍在数字的海洋中,每一串数据都像是时间的足迹,静默而深刻。今天,让我们一起翻开那本记录着......
  • (免费领源码)Java/Mysql数据库+53233基于SpringBoot的社区疫情防控系统,计算机毕业设计项
    springboot社区疫情防控管理系统摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对社区疫情防控管理系统等问题,对社区疫情防控管理系统进行研......
  • 【赛题解析】【网络建设与运维】2023年全国职业院校技能大赛中职组“网络建设与运维”
    在此之前,欢迎关注波比网络波比网络官方公众号:blbinet波比网络工作室官方公众号:blbistudio技能大赛各赛项交流群:https://www.blbi.cn/threads/40/更多正式赛题源文件访问:https://www.blbi.cn获取技术支持访问:https://www.blbi.cn/form/1/selectNISP、CIPS、PTE证书可......