深入理解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


猜你喜欢
- 选择排序:(Selection sort)是一种简单直观的排序算法,也是一种不稳定的排序方法。选择排序的原理一组无序待排数组,做升序排序,我
- 一、前言canal:阿里巴巴 MySQL binlog 增量订阅&消费组件https://github.com/alibaba/ca
- 本文介绍Android中Intent的各种常见作用。1 Intent.ACTION_MAINString: android.intent.a
- 在学习MyBatis过程中想实现模糊查询,可惜失败了。后来上百度上查了一下,算是解决了。记录一下MyBatis实现模糊查询的几种方式。 数据
- 先给最终效果图:当我们在最下边的gallery中切换图片时,上面的大图片会自动切换,切换时有动画效果哦,很简单的一个程序,有待完善更多的功能
- 自定义注解实现redisson分布式锁自定义注解package com.example.demo.annotation;import jav
- 本文中所有效果通过ItemDecoration实现,通过此实现的可以与业务解耦,让RecyclerView的模板更加简洁,不关心任何辅助性u
- Android 两个Fragment之间如何传递数据FragmentA启动FragmentB,做一些选择操作后,返回Fragme
- 1. openFeign实现基于spring-boot-starter-parent 2.6.8,spring-cloud-dependen
- mybatis-plus 3.0.1 枚举返回为null解决办法2020-11-02 14:28:48今天再次回到代码里无意间看到,原来和m
- 背景以springboot为tomcat启动的框架,以angular2为前端页面的框架,最后需要将angular2的代码运行在springb
- 面试中会经常遇到手撕代码的情况,而求TopK的是经常遇到的题目。下面我就用Java来实现。主要通过两种方法实现,快排思想以及堆排序的思想,两
- 今天朋友圈又火了,听说原因是 @腾讯官网 就能得到一顶绿色的帽子,啊呸,是一个好看的国庆节头像,可是听说没一会就502了,那么我们自己动手实
- String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要
- 一、前言:前段时间微信更新了新版本后,带来的一款H5小游戏“跳一跳”在各朋友圈里又火了起来,类似以前的“ * ”游戏,这游戏玩法简单,但加上
- 在移动端,各个平台或 UI 系统的原始指针事件模型基本都是一致,即:一次完整的事件分为三个阶段:手指按下、手指移动、和手指抬起,而更高级别的
- 获取当前年的周数 /// <summary> /// 获得今年有几周 /// </summa
- Gradle修改默认的Build配置文件名Gradle默认使用build.gradle作为默认的配置文件文件名。如果我们在build.gra
- 本文实例讲述了Java Swing中JDialog实现用户登陆UI。分享给大家供大家参考,具体如下:JDialog是一种对话框组件,它常常与
- Mybatis多层嵌套查询三张表:user article blog表的存储sql文件/*Navicat MySQL Data Transf