深入理解Java设计模式之抽象工厂模式
作者:一指流砂~ 发布时间:2023-11-28 12:11:34
一、什么是抽象工厂模式
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。
抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。
根据里氏替换原则,任何接受父类型的地方,都应当能够接受子类型。因此,实际上系统所需要的,仅仅是类型与这些抽象产品角色相同的一些实例,而不是这些抽象产品的实例。
换言之,也就是这些抽象产品的具体子类的实例。工厂类负责创建抽象产品的具体子类的实例。
二、抽象工厂模式的应用场景
当一个对象都有相同的约束时,可以使用抽象工厂模式。
打个比方说,这个工厂的几个产品都需要经过某些共同的步骤和打上相同的商标,这一组产品可以在一个工厂里面生产,减少很多重复的代码在不同的地方都出现多次。
三、抽象工厂模式和工厂方法模式对比
抽象工厂模式的定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。
工厂方法模式的定义:为某个对象提供一个接口,而且无需指定它们的具体类。
都是子类实现接口的方法,并在子类写具体的代码。
工厂方法模式中也是可以有多个具体工厂,也是可以有多个抽象产品,和多个具体工厂、具体产品类。
区别是在抽象工厂接口类中,能创建几个产品对象。
抽象工厂模式的工厂能创建多个相关的产品对象,而工厂方法模式的工厂只创建一个产品对象。
四、抽象工厂模式的优缺点
优点:
1.它分离了具体的类
2.它使得易于交换产品系列
3.它有利于产品的一致性
缺点:
难以支持新种类的产品。
抽象方法模式的最大缺点就是产品族本身的扩展非常困难。如果在产品族中增加一个新的产品类型,则需要修改多个接口,并影响现已有的工厂类。
上面这句话,有些人不怎么理解,我給大家解释一下,打个比方说,你要在这个工厂创建三个对象,原本只是创建两个对象的,那么你就要在抽象方法中添加一个创建对象的方法,那么所有实现了这个接口的类都是要重新添加这个创建对象的方法,这就是对之前的工厂有影响的原因。
五、抽象工厂模式的实现
首先是抽象工厂,生产对象的抽象。
public abstract class AbstractFactory {
abstract Size getSize();
}
下面是具体工厂
public class IphoneXFactory: AbstractFactory{
Size getSize() {
return new IphoneXSize();
}
}
public class IphoneXRFactory: AbstractFactory{
Size getSize() {
return new IphoneXRSize();
}
}
public class HuaWeiMate10Factory: AbstractFactory{
Size getSize() {
return new HuaWeiMate10Size();
}
}
public class XiaoMi8Factory: AbstractFactory{
Size getSize() {
return new XiaoMi8Size();
}
}
下面是对象抽象出来的接口
public interface Size {
public void getSize();
}
最后是我们要生产的对象
public class IphoneXSize: Size {
public void getSize() {
System.out.println("IphoneX尺寸.");
}
}
public class IphoneXRSize: Size {
public void getSize() {
System.out.println("IphoneXR尺寸.");
}
}
public class HuaWeiMate10Size: Size {
public void getSize() {
System.out.println("HuaWeiMate10尺寸.");
}
}
public class XiaoMi8Size: Size {
public void getSize() {
System.out.println("小米8尺寸.");
}
}
客户端调用
public class Test {
public static void main(String args[]){
AbstractFactory factory = new IphoneXFactory();
factory.getSize();
}
}
六、总结
工厂模式可以分为:简单工厂模式,工厂方法模式,抽象工厂模式。
简单工厂模式就没什么好说的了,无非是所有的东西都写在一个类里面,要什么就调用什么,如果要添加新的方法也是到这类里面添加,代码很多,看起来也是很乱,就像一个大工厂,什么都在里面。扩展性很低。
而工厂方法模式,把说明的理论和生产的东西就分开一点。抽象工厂模式是工厂方法模式的升级。
工厂模式与抽象工厂模式都属于创建型模式,在工厂模式中弥补了简单工厂模式的缺陷(不符合开闭原则),而在抽象工厂模式中弥补了工厂模式的不足(一个工厂只能生产一种产品)。
本篇文章就到这里了,希望能够给你带来帮助。
来源:https://www.cnblogs.com/xuwendong/p/9764984.html
猜你喜欢
- 该工具包含是封装了jedis,包含redis.properties和jedisPool,序列化使用的是protostuff,map类型操作使
- 因为mybatis好使,所以几乎需要操作数据库的时候,我都会使用mybatis,而且在一个正式的项目中,同时存在BS和CS的程序,都使用的M
- 本文实例为大家分享了java图形用户界面实现菜单功能的具体代码,供大家参考,具体内容如下题目:编写一个图形用户界面,实现菜单的功能。有3个一
- 编码&解码 通过下图我们可以了解在javaWeb中有哪些地方有转码:用户想服务器发送一个HTTP请求,需要编码的地方有ur
- Arrays.asList()方法的作用是将数组或一些元素转为集合,而你得到的集合并不是我们通常使用的List集合,而是Arrays里面的一
- 新建一个集合List<Bill> billList = new ArrayList<>();将订单中所有物品的名称提
- 定义: SharedPreferences
- 一、API简介Thread.sleep()是Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断
- 一、Sharding-JDBC简介Sharding-JDBC是Sharding-Sphere的一个产品,它有三个产品,分别是Sharding
- 今天去某在线教育面试面试官让做的一道题,题目描述如下:给定一个不重复的无序数组arr和一个定值num查找arr中是否有两个数的和等于num有
- 用法在java中经常会遇到需要对数据进行类型转换的场景,String类型的数据转为Int类型属于比较常见的场景,主要有两种转换方法:1. 使
- 这篇文章主要介绍了JPA save()方法将字段更新为null的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- Java项目涉及到数据库交互,以往常用的是JDBC,现在则有Hibernate、Mybatis等这些持久化支持。项目中用到了MyBatis,
- 1 依赖配置<parent> <groupId>org.springframework.b
- 背景Java是一种流行的编程语言,验证码是一种常用的网络安全技术。Java发展至今,网上也出现了各种各样的验证码,本人初学Java,下面是我
- 什么是线程池是一种基于池化思想管理线程的工具。池化技术:池化技术简单点来说,就是提前保存大量的资源,以备不时之需。比如我们的对象池,数据库连
- 前言Java8 由Oracle在2014年发布,是继Java5之后最具革命性的版本。Java8吸收其他语言的精髓带来了函数式编程,lambd
- 在平时的开发中,我们会经常遇到这样一个需求,要在页面通过一个『导出』按钮把查询出的数据导出到 Excel 表格中。本文即为实现上述需求的一个
- 运行远程主机上的shell脚本下面的例子是教给大家如何通过java程序,运行远程主机上的shell脚本。(我讲的不是一个黑客学习教程,而是使
- Java裁剪压缩PNG图片,透明背景色变黑import java.awt.Graphics2D;import java.awt.Image;