设计模式之抽象工厂模式

写在前面

1:介绍

1.1:什么时候用工厂方法

当我们有若干个种类的对象需要创建,并且每个种类的对象需要由多个对象协调工作才能完成任务,此时可以考虑使用抽象工厂设计模式。

1.2:UML类图

工厂方法设计模式,包含如下元素:

1:抽象工厂类工厂类的抽象,定义多个用于生产对象的方法(这里不同于工厂方法只有一个生产对象的方法)。
2:具体工厂类继承抽象工厂类,用于生产具体的某项类型的对象(产品)。
3:产品类需要被创建的类,一般由多个类构成,这多个类,统一协作,才能完成工作(这里不同于工厂方法只需要创建一个对象)。
4:客户端客户端根据需要使用对应的具体工厂类来创建具体的产品(对象)。

在这里插入图片描述

2:实例

源码 。

2.1:场景

分别需要生产自行车,汽车,飞机,这三类产品,但是每种产品都需要刹车类,轮子类,二者组合才能正常工作。

2.2:程序

  • 定义三个刹车类(包括接口)
public interface Brake {void brake();
}public class BicycleBrake implements Brake {@Overridepublic void brake() {System.out.println(this.getClass().getSimpleName() + "刹车了");}
}public class CarBrake implements Brake {@Overridepublic void brake() {System.out.println(this.getClass().getSimpleName() + "刹车了");}
}public class PlaneBrake implements Brake {@Overridepublic void brake() {System.out.println(this.getClass().getSimpleName() + "刹车了");}
}
  • 定义三个轮子类(包括接口)
public interface Wheel {void run();
}public class BicycleWheel implements Wheel {@Overridepublic void run() {System.out.println(this.getClass().getSimpleName() + " 跑了");}
}public class CarWheel implements Wheel {@Overridepublic void run() {System.out.println(this.getClass().getSimpleName() + " 跑了");}
}public class PlaneWheel implements Wheel {@Overridepublic void run() {System.out.println(this.getClass().getSimpleName() + " 跑了");}
}
  • 定义3个具体的产品类(包括接口)
public interface Vehicle {void sayHi();
}@Getter
@Setter
//@NoArgsConstructor
@AllArgsConstructor
public class Bicycle implements Vehicle {private Brake brake;private Wheel wheel;@Overridepublic void sayHi() {System.out.println(this.getClass().getSimpleName() + "组装完毕!");}
}@Getter
@Setter
//@NoArgsConstructor
@AllArgsConstructor
public class Car implements Vehicle {private Brake brake;private Wheel wheel;@Overridepublic void sayHi() {System.out.println(this.getClass().getSimpleName() + "组装完毕!");}
}@Getter
@Setter
//@NoArgsConstructor
@AllArgsConstructor
public class Plane implements Vehicle {private Brake brake;private Wheel wheel;@Overridepublic void sayHi() {System.out.println(this.getClass().getSimpleName() + "组装完毕!");}
}
  • 定义抽象工厂类以及3个具体工厂类
// A B C 分别代表 刹车 轮子 成品
public abstract class AbstractFactory<A, B, C> {// 创建刹车抽象方法protected abstract A createBrake();// 创建轮子抽象方法protected abstract B createWheel();// 创建产品public abstract C createProduct();
}public class BicycleFactory extends AbstractFactory<BicycleBrake, BicycleWheel, Bicycle> {@Overrideprotected BicycleBrake createBrake() {return new BicycleBrake();}@Overrideprotected BicycleWheel createWheel() {return new BicycleWheel();}@Overridepublic Bicycle createProduct() {Brake brake = createBrake();brake.brake();Wheel wheel = createWheel();wheel.run();return new Bicycle(brake, wheel);}
}public class CarFactory extends AbstractFactory<CarBrake, CarWheel, Car> {@Overrideprotected CarBrake createBrake() {return new CarBrake();}@Overrideprotected CarWheel createWheel() {return new CarWheel();}@Overridepublic Car createProduct() {Brake brake = createBrake();brake.brake();Wheel wheel = createWheel();wheel.run();return new Car(brake, wheel);}
}public class PlaneFactory extends AbstractFactory<PlaneBrake, PlaneWheel, Plane> {@Overrideprotected PlaneBrake createBrake() {return new PlaneBrake();}@Overrideprotected PlaneWheel createWheel() {return new PlaneWheel();}@Overridepublic Plane createProduct() {Brake brake = createBrake();brake.brake();Wheel wheel = createWheel();wheel.run();return new Plane(brake, wheel);}
}
  • 测试
public class AbstractfactoryTest {public static void main(String[] args) {CarFactory carFactory = new CarFactory();carFactory.createProduct().sayHi();System.out.println("----------");BicycleFactory bicycleFactory = new BicycleFactory();bicycleFactory.createProduct().sayHi();System.out.println("----------");PlaneFactory planeFactory = new PlaneFactory();planeFactory.createProduct().sayHi();}
}

运行:

CarBrake刹车了
CarWheel 跑了
Car组装完毕!
----------
BicycleBrake刹车了
BicycleWheel 跑了
Bicycle组装完毕!
----------
PlaneBrake刹车了
PlaneWheel 跑了
Plane组装完毕!Process finished with exit code 0

写在后面

参考文章列表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/22379.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小红书运营推广

大家好&#xff0c;我是权知星球&#xff0c;今天给大家分享一下小红手运营推广的一些经验&#xff0c;希望能给大家运营小红书带来一些帮助。 这篇文章虽然是基于小红书的运营写的&#xff0c;但新媒体的东西都是相通的&#xff0c;相信这篇文章对运营其他媒体的同学也会有所…

盘点:2023年最热门的大厂Java岗面试真题,已收录GitHub

眼看着"金九银十"也快到来了&#xff0c;很多小伙伴都蠢蠢欲动想要刚给自己涨一波薪资&#xff1b;面试作为涨薪最直接最有效的方式&#xff0c;我们需要花费巨大的精力和时间来准备。除了自身的技术积累之外&#xff0c;掌握一定的面试技巧和熟悉最常见的面试题&…

数据库性能优化中的表结构优化

数据库性能优化中的表结构优化 在数据库应用中&#xff0c;表结构的设计直接影响着数据库的性能。合理的表结构设计可以提高数据库的查询效率和性能&#xff0c;而不合理的表结构设计则可能导致查询效率低下、数据冗余、数据不一致等问题。因此&#xff0c;表结构优化是数据库…

TCP协议下的三大协议的验证实验

系列文章目录 数通王国历险记&#xff08;1&#xff09; 前言 一&#xff0c;我们要先知道PDU是什么&#xff1f; 二、TCP协议下的三大协议的验证实验 1.FTP的验证实验 1&#xff0c;拓扑图 2.将lsw4配置一下 3&#xff0c;FTP服务器端开启FTP服务&#xff1a; 4&#x…

计讯物联5G工业路由器加速赋能公交车监控系统解决方案智能升级

一、方案概述 为提升公交车智能化管理水平为目的&#xff0c;保障公交车营运人员和乘客的安全&#xff0c;计讯物联以公交车智能调度营运为核心&#xff0c;推出计讯物联5G公交车一站式解决方案&#xff0c;通过构建感知层、传输层、设备层、应用层四层架构&#xff0c;通过感…

【HCIA】07.OSPF

动态路由的协议分类 按工作区域分&#xff1a; IGP&#xff08;内部网关协议 interior gateway protocols&#xff09;&#xff1a;OSPF、IS-IS、RIPEGP&#xff08;外部网关协议 exterior gateway protocols&#xff09;&#xff1a;BGP 按工作机制及算法分类&#xff1a; 距离…

交换:交换机相关技术(二层技术)

目录 VLAN&#xff1a;虚拟局域网 VLAN种类&#xff1a; 接口分配链路类型 接口划分VLAN 跨网段的通讯 VLAN&#xff1a;虚拟局域网 LAN &#xff1a;局域网 MAN&#xff1a;城域网 WAN&#xff1a;广域网 1.一个VLAN相当于一个广播域 VLAN&#xff1a;通过路由器和交换机…

Linux 发行版 Gentoo 存在重大漏洞

网络安全公司 SonarSource 在日前研究中发现&#xff0c;Gentoo Linux 发行版中存在漏洞 CVE-2023-28424&#xff0c;黑客可以利用该漏洞进行 SQL 注入攻击。 研究人员从 GentooLinux 的 Soko 搜索组件中找到了这个漏洞。该漏洞的 CVSS 风险评分为 9.1&#xff0c;属于特别重大…

如何选择企业加密软件? 如何选择一款最好用的企业加密软件?

在当今信息时代&#xff0c;企业面临着越来越多的数据安全威胁。为了保护企业的敏感信息和数据资产&#xff0c;选择一款好用的企业加密软件至关重要。本文将从功能、安全性、用户体验和市场口碑等方面&#xff0c;为您介绍几款备受推崇的企业加密软件&#xff0c;帮助您选择适…

Spring高频面试题

2023最新版&#xff08;持续更新&#xff09; 一、Spring高频面试题1. Spring框架中的单例bean是线程安全的吗?2. 什么是AOP&#xff0c;你们项目中有没有用到AOP&#xff1f;Spring中的事务是如何实现的&#xff1f;3.Spring中事务时效的场景有哪些&#xff1f;4. Spring中be…

Redis数据结构 — Listpack

目录 listpack 结构 listpack 节点结构 quicklist 虽然通过控制 quicklistNode 结构里的压缩列表的大小或者元素个数&#xff0c;来减少连锁更新带来的性能影响&#xff0c;但是并没有完全解决连锁更新的问题。 于是&#xff0c;Redis 在 5.0 新设计一个数据结构叫 listpack…

03关于golang中各种运算符的讲解代码和注释

运算符 算术运算符&#xff1a;关系运算符&#xff1a;逻辑运算符&#xff1a;赋值运算符&#xff1a;位运算符&#xff1a; 在Golang中&#xff0c;运算符是用于执行各种数学和逻辑操作的符号。本文将对Golang中常见的运算符进行讲解&#xff0c;并提供一些示例代码和注释。 …