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

抽象工厂模式

抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不同的产品实例,而无需关心它们实际实现的是哪个具体产品。

抽象工厂模式的实现分为以下几个步骤:

  1. 定义抽象产品接口:抽象工厂模式的核心是抽象产品接口,它定义了产品的基本结构和行为。
  2. 定义具体工厂接口:具体工厂接口是实现抽象产品接口的工厂类,它们负责创建具体产品实例。
  3. 定义工厂:每个具体工厂都是一个特定领域的工厂,它实现了抽象工厂接口,并提供了具体的产品实现。
  4. 创建产品实例:使用抽象工厂接口,客户端可以创建不同的产品实例,而无需指定具体的子类。

优缺点

优点:

  1. 具体产品在应用层的代码隔离,无需关系创建的细节。
  2. 将一个系列的产品统一到一起创建,方便产品族的扩展。
  3. 提供一个产品类的库,所有的产品以同样的接口出现,使得客户端不依赖于具体实现。
  4. 通过创建不同的工厂对象来创建不同的产品实例,无需关心它们实际实现的是哪个具体产品。

缺点:

  1. 规定了所有可能被创建的产品集合,产品族中扩展新的产品困难。
  2. 增加了系统的抽象性和理解难度。
  3. 使用场景:客户端(应用层)不依赖与产品类的实现等细节。
  4. 需要大量的重复代码,增加了开发和维护的成本。

使用场景

  1. 一个系统要独立于它的产品的创建、组合和表示时。
  2. 一个系统要由多个产品系列中的一个来配置时。
  3. 需要强调一系列相关的产品对象的设计以便进行联合使用时。
  4. 提供一个产品类库,而只想显示它们的接口而不是实现时。
  5. 产品之间相互关联、相互依赖且相互约束的地方。

具体实现

以下以智能产品汽车和手机为例,继承关系如下:

定义抽象工厂

/**
* 智能产品抽象工厂
*/
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();
}

打印如下:

工厂方法模式和抽象工厂模式区别

工厂方法模式和抽象工厂模式都是创建型模式,区别如下:

  1. 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。
  2. 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
  3. 工厂方法模式的使用很简单,只要继承成子类,并实现工厂方法的工厂就可以了,而抽象工厂模式需要先实例化它,然后将它传入一些针对抽象类型所写的代码中。
  4. 工厂方法模式的优点是可以把一群相关的产品集合起来,而抽象工厂模式的优点是可以把一群相关的产品集合起来,并且创建整个产品家族的模式。

总之,工厂方法是由子类自行决定实例化那个类,而抽象工厂是自己决定实例化哪个类。至于是组合还是继承还是实现接口都无所谓。根本区别在于是自己实例化还是子类实例化。

如果产品单一,只有一个产品等级结构适合使用工厂方法模式。如果存在多个产品等级,产品分类多个可以形成产品族合适使用抽象工厂模式。

补充说明

后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。

快捷导航
设计模式简介总结
单例模式详解
工厂方法模式
抽象工厂模式

java设计模式【抽象工厂模式】的更多相关文章

  1. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  2. Java设计模式-抽象工厂模式(Abstract Factory )

    工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这 ...

  3. 2.java设计模式-抽象工厂模式

    抽象工厂模式简介: 每一个模式都是针对某一种问题的解决方案.抽象工厂模式与工厂模式最大的区别在于,工厂模式针对的是一个产品等级结构,而抽象工厂模式面对的是多个产品等级结构,即产品族的概念. 这里讲解一 ...

  4. Java设计模式-抽象工厂模式(Abstarct Factory)

    抽象工厂模式 举个生活中常见的例子,组装电脑,在组装电脑时,通常需要选择一系列的配件,比如CPU,硬盘,内存,主板,电源,机箱等,为了讨论使用简单,值考虑选择CPU和主板的问题. 事实上,在选择CPU ...

  5. Java设计模式——抽象工厂模式

    抽象工厂模式也是创建模式,可以把它理解成创建工厂的工厂,这种模式也是我们经常使用的.在抽象工厂中的接口是用来创建工厂的,每个生成的工厂又都可以按照工厂模式创建其他对象. 举例说明: 创建Shape接口 ...

  6. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  7. 浅析JAVA设计模式之工厂模式(一)

    1 工厂模式简单介绍 工厂模式的定义:简单地说,用来实例化对象,取代new操作. 工厂模式专门负责将大量有共同接口的类实例化.工作模式能够动态决定将哪一个类实例化.不用先知道每次要实例化哪一个类. 工 ...

  8. Java设计模式之工厂模式(Factory模式)介绍(转载)

    原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...

  9. Java 设计模式之工厂模式(二)

    原文地址:Java 设计模式之工厂模式(二) 博客地址:http://www.extlight.com 一.背景 本篇内容是 Java 设计模式创建型模式的第二篇.上一篇主题为 <Java 设计 ...

  10. 浅析JAVA设计模式之工厂模式(二)

    1 工厂方法模式简单介绍 工厂方法 (Factroy Method)模式:又称多态性工厂模式(Polymorphic Factory),在这样的模式中,核心工厂不再是一个详细的类.而是一个抽象工厂,提 ...

随机推荐

  1. 每次新建项目都要重新配置Maven项目很麻烦,这里出一个小技巧,配置一次就直接搞定所有的

    Maven一次配置永久使用教程 首先,打开IDEA,将你目前放出来的项目关掉:(File->Close Project) 其次,在左侧栏里面选择这个: 然后,选择中间的这里: 接着,在弹出的页面 ...

  2. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(11)-Charles如何模拟弱网环境

    1.前言 张三:"我写的软件好奇怪啊,在网络好的时候一点问题也没有,但是信号差的时候明显卡顿,看来我只能一直蹲在卫生间.电梯或者地铁(信号差)调bug了". Charles:&qu ...

  3. Android 音视频采集那些事

    音视频采集 在整个音视频处理的过程中,位于发送端的音视频采集工作无疑是整个音视频链路的开始.在 Android 或者 IOS 上都有相关的硬件设备--Camera 和麦克风作为输入源.本章我们来分析如 ...

  4. 【读书笔记】Nice Families Of GF

    目录 Nice Families Of GF rational rational algebraic D-finite总览 下定义 逻辑关系 例子 更多的例子和判别法 运算是否有性质? 运算是否有性质 ...

  5. 怎么用ChatGPT写代码,ChatGPT怎么改代码修BUG

    ChatGPT 是一个自然语言处理模型,可以模拟人类语言生成文本,可以用于写代码和修复bug.在本文中,我们将介绍如何使用 ChatGPT 写代码和修bug. 怎么用ChatGPT写代码? 虽然 Ch ...

  6. 【故障公告】数据库服务器 CPU 近 100% 造成全站故障,雪上加霜难上加难的三月

    数据库服务器 CPU 近 100% 问题几乎每年都要发生一次,上次发生在去年1月31日,每次都是通过主备切换或者重启实例解决,数据库服务用的是阿里云 RDS SQL Server 2016 标准版. ...

  7. Bean的自动装配(Autowired)

    Bean的自动装配(Autowired) 自动装配是Spring满足bean依赖的一种方式 Spring会在上下文中自动寻找,并自动给bean装配属性 在Spring中有三种自动装配的方式 在xml中 ...

  8. 聊一聊如何使用Crank给我们的类库做基准测试

    目录 背景 什么是 Crank 入门示例 Pull Request 总结 参考资料 背景 当我们写了一个类库提供给别人使用时,我们可能会对它做一些基准测试来测试一下它的性能指标,好比内存分配等. 在 ...

  9. vue之数组与对象的检测与更新

    目录 说明 语法 示例 说明 MVVM会自动检测变量的变化,当变量改变,页面也会对应的变化,但是有一点需要注意,如果有一个对象增加值的时候,不能直接修改,需要使用Vue.set()方法 语法 Vue. ...

  10. 二进制安装Kubernetes(k8s) v1.23.5

    Github:https://github.com/cby-chen/Kubernetes/releases 前提说明:公主号不支持富文本,建议在Github查看. 1.23.3 和 1.23.4 和 ...