java设计模式【抽象工厂模式】
java设计模式【抽象工厂模式】

抽象工厂模式
抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不同的产品实例,而无需关心它们实际实现的是哪个具体产品。
抽象工厂模式的实现分为以下几个步骤:
- 定义抽象产品接口:抽象工厂模式的核心是抽象产品接口,它定义了产品的基本结构和行为。
- 定义具体工厂接口:具体工厂接口是实现抽象产品接口的工厂类,它们负责创建具体产品实例。
- 定义工厂:每个具体工厂都是一个特定领域的工厂,它实现了抽象工厂接口,并提供了具体的产品实现。
- 创建产品实例:使用抽象工厂接口,客户端可以创建不同的产品实例,而无需指定具体的子类。
优缺点
优点:
- 具体产品在应用层的代码隔离,无需关系创建的细节。
- 将一个系列的产品统一到一起创建,方便产品族的扩展。
- 提供一个产品类的库,所有的产品以同样的接口出现,使得客户端不依赖于具体实现。
- 通过创建不同的工厂对象来创建不同的产品实例,无需关心它们实际实现的是哪个具体产品。
缺点:
- 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难。
- 增加了系统的抽象性和理解难度。
- 使用场景:客户端(应用层)不依赖与产品类的实现等细节。
- 需要大量的重复代码,增加了开发和维护的成本。
使用场景
- 一个系统要独立于它的产品的创建、组合和表示时。
- 一个系统要由多个产品系列中的一个来配置时。
- 需要强调一系列相关的产品对象的设计以便进行联合使用时。
- 提供一个产品类库,而只想显示它们的接口而不是实现时。
- 产品之间相互关联、相互依赖且相互约束的地方。
具体实现
以下以智能产品汽车和手机为例,继承关系如下:

定义抽象工厂
/**
* 智能产品抽象工厂
*/
public interface SmartProductFactory {
ISmartPhone createSmartPhone();
ISmartCar createSmartCar();
}
具体工厂
/**
* @author physicx
* @date 2023/5/17 上午11:18
* @desc 华为工厂
* Created with IntelliJ IDEA
*/
public class HuaweiFactory implements SmartProductFactory {
@Override
public ISmartPhone createSmartPhone() {
return new HuaweiSmartPhone();
}
@Override
public ISmartCar createSmartCar() {
return new HuaweiSmartCar();
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:18
* @desc 小米工厂
* Created with IntelliJ IDEA
*/
public class XiaomiFactory implements SmartProductFactory {
@Override
public ISmartPhone createSmartPhone() {
return new XiaomiSmartPhone();
}
@Override
public ISmartCar createSmartCar() {
return new XiaomiSmartCar();
}
}
定义抽象产品
/**
* 智能手机
*/
public interface ISmartPhone {
void printInfo();
}
/**
* 智能汽车
*/
public interface ISmartCar {
void printInfo();
}
具体产品
/**
* @author physicx
* @date 2023/5/17 上午11:19
* @desc 华为智能汽车
* Created with IntelliJ IDEA
*/
public class HuaweiSmartCar implements ISmartCar {
@Override
public void printInfo() {
System.out.println("华为智能汽车");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 华为智能手机
* Created with IntelliJ IDEA
*/
public class HuaweiSmartPhone implements ISmartPhone {
@Override
public void printInfo() {
System.out.println("华为智能手机");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 小米智能汽车
* Created with IntelliJ IDEA
*/
public class XiaomiSmartCar implements ISmartCar {
@Override
public void printInfo() {
System.out.println("小米智能汽车");
}
}
/**
* @author guogq
* @date 2023/5/17 上午11:19
* @desc 小米智能手机
* Created with IntelliJ IDEA
*/
public class XiaomiSmartPhone implements ISmartPhone {
@Override
public void printInfo() {
System.out.println("小米智能手机");
}
}
客户端调用
public static void main(String[] args) {
HuaweiFactory huaweiFactory = new HuaweiFactory();
huaweiFactory.createSmartPhone().printInfo();
huaweiFactory.createSmartCar().printInfo();
XiaomiFactory xiaomiFactory = new XiaomiFactory();
xiaomiFactory.createSmartPhone().printInfo();
xiaomiFactory.createSmartCar().printInfo();
}
打印如下:

工厂方法模式和抽象工厂模式区别
工厂方法模式和抽象工厂模式都是创建型模式,区别如下:
- 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
- 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
- 工厂方法模式的使用很简单,只要继承成子类,并实现工厂方法的工厂就可以了,而抽象工厂模式需要先实例化它,然后将它传入一些针对抽象类型所写的代码中。
- 工厂方法模式的优点是可以把一群相关的产品集合起来,而抽象工厂模式的优点是可以把一群相关的产品集合起来,并且创建整个产品家族的模式。
总之,工厂方法是由子类自行决定实例化那个类,而抽象工厂是自己决定实例化哪个类。至于是组合还是继承还是实现接口都无所谓。根本区别在于是自己实例化还是子类实例化。
如果产品单一,只有一个产品等级结构适合使用工厂方法模式。如果存在多个产品等级,产品分类多个可以形成产品族合适使用抽象工厂模式。
补充说明
后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。
| 快捷导航 |
|---|
| 设计模式简介总结 |
| 单例模式详解 |
| 工厂方法模式 |
| 抽象工厂模式 |
java设计模式【抽象工厂模式】的更多相关文章
- JAVA设计模式--抽象工厂模式
抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...
- Java设计模式-抽象工厂模式(Abstract Factory )
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...
- 2.java设计模式-抽象工厂模式
抽象工厂模式简介: 每一个模式都是针对某一种问题的解决方案.抽象工厂模式与工厂模式最大的区别在于,工厂模式针对的是一个产品等级结构,而抽象工厂模式面对的是多个产品等级结构,即产品族的概念. 这里讲解一 ...
- Java设计模式-抽象工厂模式(Abstarct Factory)
抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...
- Java设计模式——抽象工厂模式
抽象工厂模式也是创建模式,可以把它理解成创建工厂的工厂,这种模式也是我们经常使用的.在抽象工厂中的接口是用来创建工厂的,每个生成的工厂又都可以按照工厂模式创建其他对象. 举例说明: 创建Shape接口 ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- 浅析JAVA设计模式之工厂模式(一)
1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...
- Java 设计模式之工厂模式(二)
原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...
- 浅析JAVA设计模式之工厂模式(二)
1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...
随机推荐
- 《MySQL是怎样运行的》第一章小结
- lua的一些封装方法
获取点击屏幕坐标 1 function getTouchPosition() 2 local locationX, locationY 3 4 local listener = cc.EventLis ...
- Javaweb基础复习------Filter相关应用+登录验证案例的使用
Filter(过滤器) 基本步骤: 1.定义类,实现Filter接口,并重写其所有方法 2.配置Filter拦截资源的路径,在类上定义2 WebFilter注解(WebFilter配置的路径,是拦截资 ...
- 基于 RocketMQ Connect 构建数据流转处理平台
本文作者:周波,阿里云智能高级开发工程师, Apache RocketMQ Committer . 01 从问题中来的RocketMQ Connect 在电商系统.金融系统及物流系统,我们经常可以看到 ...
- ctfshow VIP限免题目(最新)
源码泄露 这一题主要考察如何查看网页源代码,查看方式主要有三种 在网页前面加上view-source: 右键页面,点击查看页面源代码 键盘上按下F12打开开发者工具,在查看器中查看源代码 这一题随便一 ...
- SpringBoot——定制错误页面及原理
更多内容,前往 IT-BLOG 一.SpringBoot 默认的错误处理机制 [1]浏览器返回的默认错误页面如下: ☞ 浏览器发送请求的请求头信息如下:text/html 会在后面的源码分析中说到 ...
- Zookeeper 从入门到精通
更多内容,前往IT-BLOG 一.Zookeeper概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目.Zookeeper从设计模式角度来理解:是一个基于观察者模 ...
- 【Visual Leak Detector】QT 中 VLD 输出解析(四)
说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记. 目录 说明 1. 使用方式 2. 测试代码 3. 使用 32 bit 编译器时的输出 4. 使用 64 bit 编译器时的输出 5. 输 ...
- Linux线程同步必知,常用方法揭秘!
一.为什么要线程同步 在Linux 多线程编程中,线程同步是一个非常重要的问题.如果线程之间没有正确地同步,就会导致程序出现一些意外的问题,例如: 竞态条件(Race Condition):多个线程同 ...
- NEFU-NSILAB2021选拔赛WriteUp
Web signin 打开看到源码: <?php highlight_file(__FILE__); $file = $_GET['file']; if ($file) { include $f ...