抽象工厂模式
时间:2019-04-20
本文章向大家介绍抽象工厂模式,主要包括抽象工厂模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1:实例
某客户想要购买一辆车,他要联系4S店,首先得有4S店(抽象工厂)的电话。
客户上网查询(建造工厂),发现了宝马4S店(具体工厂)的电话和奔驰4S店(具体工厂)的电话。
客户拨通了宝马4S店的电话(获取具体工厂),发现目前店里可以提供(生产)多款车型(具体产品)供
客户选择(BMW 320、BMW 530,BMW 740)。
客户拨通了奔驰4S店的电话(获取具体工厂),发现目前店里可以提供(生产)多款车型(具体产品)供
客户选择(BenzC200、BenzE300)。
代码实现:
1:车的最高级抽象
package AbstractFactory; /** * 作用:最高级抽象产品,用于抽象工厂的建造方法的返回值 */ public abstract class Car { abstract void drive(); }
2:宝马车的抽象和实现
package AbstractFactory; /** * 作用:宝马产品的产品类 */ public abstract class BMWCar extends Car{ } //宝马BMW320的具体实现 class BMW320 extends BMWCar{ @Override void drive() { System.out.println("BMW320,老板专用。"); } } //宝马BMW530的具体实现 class BMW530 extends BMWCar { public void drive() { System.out.println("BMW530,时不我待。"); } }
3:奔驰车的抽象和实现
package AbstractFactory; /** * 作用:奔驰汽车的产品类 */ public abstract class BenzCar extends Car { } //奔驰C200的具体实现 class BenzC200 extends BenzCar { public void drive() { System.out.println("BenzC200,实惠有面"); } } //奔驰E300的具体实现 class BenzE300 extends BenzCar { public void drive() { System.out.println("BenzE300,商务气派"); } }
4:抽象工厂,宝马工厂和奔驰车厂来实现它
package AbstractFactory; /** * 作用:抽象工厂类 */ public abstract class AbstractFactory { public abstract Car getCar(String type) throws ClassNotFoundException, IllegalAccessException, InstantiationException; } //宝马工厂,生产所有的宝马类型 class BMWFactory extends AbstractFactory{ @Override public Car getCar(String type) throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class<?> aClass = Class.forName(type); return (BMWCar) aClass.newInstance(); } } //奔驰工厂,生产所有的奔驰 class BenzFactory extends AbstractFactory{ @Override public Car getCar(String type) throws ClassNotFoundException, IllegalAccessException, InstantiationException { Class<?> aClass = Class.forName(type); return (BenzCar) aClass.newInstance(); } }
5:超级工厂,建造工厂的工厂
package AbstractFactory; /** * 作用:超级工厂类,建造工厂的工厂 */ public class FactoryProducer { public static AbstractFactory getFactory(String type) throws IllegalAccessException, InstantiationException, ClassNotFoundException { Class cl = Class.forName(type); System.out.println("创建工厂:"+type); return (AbstractFactory)cl.newInstance(); } }
6:测试
package AbstractFactory; /** * 作用: */ public class Demo { public static void main(String[] args) throws Exception{ //超级工厂去创建生产宝马的工厂 AbstractFactory bmwFactory = FactoryProducer.getFactory("AbstractFactory.BMWFactory"); //宝马工厂去生产具体的宝马类型 bmwFactory.getCar("AbstractFactory.BMW320").drive(); //超级工厂去创建生产宝马的工厂 AbstractFactory benzFactory = FactoryProducer.getFactory("AbstractFactory.BenzFactory"); //宝马工厂去生产具体的宝马类型 benzFactory.getCar("AbstractFactory.BenzC200").drive(); } }
- Docker+Jenkins持续集成环境(3)集成PMD、FindBugs、Checkstyle静态代码检查工具并邮件发送检查结果
- Javascript中的Label语句
- 从编辑距离、BK树到文本纠错
- iframe基本知识及iframe版本Tab切换
- switch语句以及与if的比较
- kgtemp文件转mp3工具
- AJAX原理与步骤
- 【编程基础】C语言FILE结构体以及缓冲区深入探讨
- 获取标签的那些事 之 动态集合
- 一起读源码之zookeeper(1) -- 启动分析
- R语言与机器学习(分类算法)决策树算法
- HTML5视音频-解决全屏下出现的控制栏
- 移动端H5知识[系列] - 固定像素的实现方法
- 谈谈个人网站的建立(八)—— 缓存的使用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring IoC依赖注入:Spring提供了哪些依赖注入模式和类型呢?
- 谈谈volatile
- 【V-REP自学笔记(八)】控制youBot抓取和移动物体
- Gson 简单使用姿势小结
- 【SpringBoot WebFlux 系列】WebFlux 之 Path 参数解析与 url 映射
- 「推荐」阿里开源的分布式事务框架 Seata
- BeanDefinition元信息:除了Bean名称和类名,还有哪些Bean元信息值得关注?
- 【SpringBoot WebFlux 系列】 header 参数解析
- MySQL为什么还有kill不掉的语句?
- 【SpringBoot DB 系列】h2databse 集成示例 demo
- 在grant语句之后要跟着flush privileges吗?
- Python实现数据写入 Excel 的三种模块!
- redis的两种持久化的机制,你真的了解么?
- 绝对能让你彻底明白的Redis的内存淘汰策略
- redis缓存穿透穿透解决方案-布隆过滤器