1. 什么是抽象工厂模式

  • 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类
  • 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
    工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列

2. 抽象工厂模式的优点/缺点及适用场景

2.1 抽象工厂模式的优点

  • 具体产品在应用层的代码隔离,无需关心创建的细节
  • 将一个系列的产品统一到一起创建

2.2 抽象工厂模式的缺点

  • 具体产品在应用层的代码隔离,无需关系创建的细节
  • 将一个系列的产品统一到一起创建

2.3 抽象工厂模式的适用场景

  • 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
  • 提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

3.抽象工厂模式简单案例

3.1 创建抽象工厂

  • 可以生产手机也可以生成电脑
package com.san.factroy.abst;import com.san.factroy.fac.Computer;
import com.san.factroy.fac.Mobile;/*** @ClassName AbstFactory* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:21* @Version 1.0**/
public abstract class AbstFactory {public abstract Mobile genMobile();public abstract Computer genComputer();
}

3.2 创建苹果工厂

  • 创建苹果工厂并继承抽象工厂 可以生产手机和电脑
package com.san.factroy.apple;import com.san.factroy.abst.AbstFactory;
import com.san.factroy.fac.Computer;
import com.san.factroy.fac.Mobile;/*** @ClassName IphoneFactory* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:23* @Version 1.0**/
public class IphoneFactory extends AbstFactory {@Overridepublic Mobile genMobile() {return new Iphone();}@Overridepublic Computer genComputer() {return new MacBook();}
}

3.3 创建小米工厂

  • 创建小米工厂并继承抽象工厂 可以生产手机和电脑
package com.san.factroy.mi;import com.san.factroy.abst.AbstFactory;
import com.san.factroy.fac.Computer;
import com.san.factroy.fac.Mobile;/*** @ClassName MiFactory* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:26* @Version 1.0**/
public class MiFactory extends AbstFactory {@Overridepublic Mobile genMobile() {return new MiMobile();}@Overridepublic Computer genComputer() {return new MiComputer();}
}

3.4 创建手机产品

  • 手机有拨打电话和发送短信的功能
package com.san.factroy.fac;/*** @ClassName Mobile* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:15* @Version 1.0**/
public interface Mobile {/*** 拨打电话** @param* @return void* @author ZhangSan_Plus* @description //TODO* @date 19:17 2022/10/12**/void dialNumber();/*** 发送断线** @param* @return void* @author ZhangSan_Plus* @description //TODO* @date 19:17 2022/10/12**/void sendMsg();
}

3.5 创建电脑产品

  • 电脑有玩游戏和编写Java程序的功能
package com.san.factroy.fac;/*** @ClassName Computer* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:17* @Version 1.0**/
public interface Computer {/*** 玩游戏** @param* @return void* @author ZhangSan_Plus* @description //TODO* @date 19:18 2022/10/12**/void playGames();/*** 写Java程序** @param* @return void* @author ZhangSan_Plus* @description //TODO* @date 19:18 2022/10/12**/void writeJava();
}

3.6 小米手机和小米电脑

  • 小米手机
package com.san.factroy.mi;import com.san.factroy.fac.Mobile;/*** @ClassName MiMobile* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:25* @Version 1.0**/
public class MiMobile implements Mobile {@Overridepublic void dialNumber() {System.out.println("MI 拨打电话");}@Overridepublic void sendMsg() {System.out.println("MI 发送短信");}
}
  • 小米电脑
package com.san.factroy.mi;import com.san.factroy.fac.Computer;/*** @ClassName MiComputer* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:25* @Version 1.0**/
public class MiComputer implements Computer {@Overridepublic void playGames() {System.out.println("Mi电脑 打游戏");}@Overridepublic void writeJava() {System.out.println("Mi电脑 编写Java程序");}
}

3.7 苹果手机和苹果电脑

  • 苹果手机
package com.san.factroy.apple;import com.san.factroy.fac.Mobile;/*** @ClassName Iphone* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:19* @Version 1.0**/
public class Iphone implements Mobile {@Overridepublic void dialNumber() {System.out.println("苹果 拨打电话");}@Overridepublic void sendMsg() {System.out.println("苹果 发送短信");}
}
  • 苹果电脑
package com.san.factroy.apple;import com.san.factroy.fac.Computer;/*** @ClassName MacBook* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:20* @Version 1.0**/
public class MacBook implements Computer {@Overridepublic void playGames() {System.out.println("MacBook 打游戏");}@Overridepublic void writeJava() {System.out.println("MacBook 编写Java程序");}
}

3.8 具体使用

package com.san.factroy;import com.san.factroy.abst.AbstFactory;
import com.san.factroy.apple.IphoneFactory;
import com.san.factroy.fac.Computer;
import com.san.factroy.fac.Mobile;
import com.san.factroy.mi.MiFactory;/*** @ClassName Client* @Description TODO* @Author ZhangSan_Plus* @Date 2022/10/12 19:28* @Version 1.0**/
public class Client {public static void main(String[] args) {AbstFactory iphoneFac = new IphoneFactory();AbstFactory miFac = new MiFactory();Computer macBook = iphoneFac.genComputer();Computer miComputer = miFac.genComputer();Mobile miMobile = miFac.genMobile();Mobile iphone = iphoneFac.genMobile();macBook.playGames();miComputer.playGames();miMobile.dialNumber();iphone.dialNumber();}
}

4.抽象工厂模式在Java中的应用

  • 在 Spring 中,BeanFactory 是用于管理 Bean 的一个工厂,所有工厂都是 BeanFactory 的子类。这样我们可以通过 IOC 容器来管理访问 Bean,根据不同的策略调用 getBean() 方法,从而获得具体对象。
package org.springframework.beans.factory;import org.springframework.beans.BeansException;
import org.springframework.core.ResolvableType;
import org.springframework.lang.Nullable;public interface BeanFactory {String FACTORY_BEAN_PREFIX = "&";Object getBean(String name) throws BeansException;<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;Object getBean(String name, Object... args) throws BeansException;<T> T getBean(Class<T> requiredType) throws BeansException;<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;boolean containsBean(String name);boolean isSingleton(String name) throws NoSuchBeanDefinitionException;boolean isPrototype(String name) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;@NullableClass<?> getType(String name) throws NoSuchBeanDefinitionException;String[] getAliases(String name);}

设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用相关推荐

  1. 【设计模式】抽象工厂模式 ( 简介 | 适用场景 | 优缺点 | 产品等级结构和产品族 | 代码示例 )

    文章目录 一.抽象工厂模式简介 二.抽象工厂模式适用场景 三.抽象工厂模式优缺点 四.产品等级结构和产品族 五.抽象工厂模式代码示例 1.冰箱抽象类 2.美的冰箱实现类 3.格力冰箱实现类 4.空调抽 ...

  2. 王争 | 设计模式之美 - 工厂模式:我为什么说没事不要随便用工厂模式创建对象?

    1. 简单工厂(Simple Factory) 在下面这段代码中,我们根据配置文件的后缀(json.xml.yaml.properties),选择不同的解析器(JsonRuleConfigParser ...

  3. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人 话说:"天地开辟,未有人民,女娲抟土为人."女娲需要用土造出一个个的人,但在女娲造出人之前, ...

  4. 简单学习Java中的抽象语法树(AST)

    概述 抽象语法树(AST)是一种数据结构,代表了一种编程语言的抽象语法.它通常在编译器中用来解析源代码和生成机器代码. 在Java中,AST通常由一个解析器创建,该解析器读取源代码并创建一个树状结构, ...

  5. 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.策略模式简介 二.策略模式适用场景 三.策略模式优缺点 四.策略模式与其它设计模式 五.策略模式代码示例 1.促销策略接口 2.满减促销策略 3.返现促销策略 4.空促销策略 5.促销策 ...

  6. 【设计模式】外观模式 ( 概念 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 I . 外观模式概念 II . 外观模式 适用场景 III . 外观模式 优缺点 IV . 外观模式与其它设计模式的联系与区别 V . 外观模式 代码示例 I . 外观模式概念 1 . 外观 ...

  7. 【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.建造者模式简介 二.建造者模式适用场景 三.建造者模式优缺点 四.建造者模式与工厂模式 五.建造者模式代码示例 1.学生类 2.建造者抽象类 3.建造者实现类 4.教师类 ( 非必须 ) ...

  8. 设计模式之外观模式及其应用场景

    外观(Facade)模式,又叫做门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问的模式.比如说我们日常生活中医院的分诊台,就是实现统一访问接口的特性: 一.外观模式 ...

  9. 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.桥接模式简介 二.桥接模式适用场景 三.桥接模式优缺点 四.桥接模式相关设计模式 五.桥接模式代码示例 1.视频格式抽象 2.FLV 视频格式实现 3.MP4 视频格式实现 4.系统平台 ...

最新文章

  1. java测试类 main方法_Java使用agent实现main方法之前的实例详解
  2. Eclipse-Java代码规范和质量检查插件-阿里编码规约
  3. 【测试】小龟小车A2裸板下载arduino程序
  4. 【问链财经-区块链基础知识系列】 第二十六课 隐私保护方法:多方安全计算和区块链
  5. ITK:追加两个3D体积
  6. java获取文件列表_java获取指定目录中的文件列表
  7. 体制内工作了十几年,跳出来学嵌入式合适吗?
  8. Linux的tomcat日志分割,linux下tomcat日志分割
  9. sql日期处理(出自邹建的book)
  10. ASP.NET Core 静态文件 - ASP.NET Core 基础教程 - 简单教程,简单编程
  11. centos怎么用命令行启动mysql_centos怎么用命令行启动mysql数据库
  12. 苹果基带坏了怎么办_「手机维修自学教程」苹果手机的基带逻辑码片读取技巧 保资料搬板...
  13. 订单系统:订单拆单规则与流程详解
  14. win7如何调整计算机c盘,win7系统让c盘和d盘合并的两种方法
  15. linux智能电压表设计与实现,智能电压表的设计
  16. 智能网联车路协同智慧交通沙盘+无人驾驶汽车+多车协同调度系统
  17. 键值数据库PebblesDB读后感
  18. 2021甘肃高考师大附中成绩查询,西北师范大学附属中学2021年录取分数线
  19. php微信小程序支付流程,微信小程序支付流程
  20. 推荐 5 个本周 火火火 的开源项目

热门文章

  1. 一文读懂数据挖掘的技术和应用
  2. 【Linux驱动】I2C子系统与触摸屏驱动
  3. 为什么次对角线元素均不为零的三对角矩阵为不可约矩阵
  4. Cglib动态代理实现及原理
  5. 【数论知识】能被2、3、4、5、6、7、8、9 等数整除的数的特征
  6. Python 去掉空格的方法
  7. 挂耳式运动耳机哪个品牌好?挂耳式骨传导运动耳机推荐
  8. 三维CAD发展进入国家规划布局
  9. Form窗体添加背景图片
  10. CAD-VB多段线、波浪线、射线、构造线