设计模式(二)、工厂模式--工厂方法模式

news/2024/11/26 6:02:02/

工厂方法模式是一种常用的创建型设计模式。它解决了简单工厂模式的问题:如违反了开闭原则,其次可以用于更复杂的结构

它的核心结构有四个角色  抽象工厂;具体工厂;抽象产品;具体产品

抽象工厂(抽象类或接口)不在负责具体的创建过程,即具体的代码实现。只制定了规范,具体的实现将由具体的工厂去实现。在这个模式中,工厂类和产品类往往可以依次对应。即一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品,这个具体的工厂就负责生产对应的产品。
 

工厂方法模式(Factory Method pattern)是最典型的模板方法模式的应用

代码示例如下:

定义一个抽象工厂类:

/*** 蛋糕工厂类* 定义蛋糕工厂类 该类主要是定义了createCake抽象方法,并且在无参构造函数中进行调用,具体的实现是在子类里进行实例化的*/
public abstract class CakeFactory {abstract Cake createCake();public CakeFactory() {createCake();}
}

定义具体的工厂类:

/*** @desc: 苹果蛋糕工厂类类*/
public class AppleCakeFactory extends CakeFactory{@Overridepublic Cake createCake() {return new AppleCake();}
}
/*** @desc: 香蕉蛋糕工厂类*/
public class BananaCakeFactory extends CakeFactory{@Overridepublic Cake createCake() {return new BananaCake();}
}

定义抽象产品类:

/*** 蛋糕父类*/
public abstract class Cake {
}

定义具体的产品类:

/*** 苹果蛋糕*/
public class AppleCake extends Cake {public AppleCake(){System.out.println("创建了苹果蛋糕实例");}
}
/*** 香蕉蛋糕*/
public class BananaCake extends Cake {public BananaCake(){System.out.println("创建了香蕉蛋糕实例");}
}

测试类

/*** 测试类*/
public class Test {public static void main(String[] args) {AppleCakeFactory appleCakeFactory = new AppleCakeFactory();BananaCakeFactory bananaCakeFactory = new BananaCakeFactory();}
}

工厂方法经常用在以下两种情况中:

第一种情况是对于某个产品,调用者清楚地知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来。java Collection中的iterator() 方法即属于这种情况。

第二种情况,只是需要一种产品,而不想知道也不需要知道究竟是哪个工厂为生产的,即最终选用哪个具体工厂在生产者一方,它们根据当前系统的情况来实例化一个具体的工厂返回给使用者,这个决策过程对生产者来说是透明的。


http://www.ppmy.cn/news/811193.html

相关文章

IDEA 集成 GIT

文章目录 16.IDEA中使用GIT-基本操作-add与commit 掌握目标内容 17.IDEA中使用GIT-基本操作-差异化比较目标内容 18.IDEA中使用GIT-基本操作-版本回退及撤消目标内容 19.IDEA中使用GIT-远程仓库-创建与关联远程仓库学习目标: 20.GitLab使用介绍_项目、用户和组介绍(…

Vue.js身份证读卡器阅读器谷歌chrome火狐Firefox网页实现读取方法

// // **无缝支持新版本谷歌Chrome火狐Firefox网页浏览器&#xff0c;支持H5、Vue、React、Node.js、jQuery、JSP、PHP、ASP、ASPX、JS、HTML等开发语言 // 控件版本&#xff1a;V4.2.3&#xff0c;前端修改日期&#xff1a;2020.08.25 // <template><div id"a…

计算机传输232信号,RS-232串行通信原理:全双工案例分析,一看就懂

RS-232是美国电子工业协会EIA(Electronic Industry Association)制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写&#xff0c;232为标识号。RS-232是对电气特性以及物理特性的规定&#xff0c;只作用于数据的传输通路上&#xff0c;它并不内含对数据的处理方式。但是目…

Java阶段五Day02

Java阶段五Day02 文章目录 Java阶段五Day02MAVEN-聚合(多模块3)回顾多模块2个特性依赖:继承: 聚合场景聚合目的实现聚合聚合总结 远程仓库远程仓库概念配置settings.xml远程库配置注意事项 GIT详细学习git概括git历史本地版本控制相关命令git分支管理分支管理基本概念分支管理相…

css3 js 做一个旋转音乐播放开关

我们经常会看到一些旋转音乐播放开关,今天我也写了一个分享出来,大家需要的话可以参考一下: <!DOCTYPE html> <html lang="en"> <head><meta

浅谈 STM32 硬件I2C的使用 (中断方式 无DMA 无最高优先级)

原创&#xff1a;茶杯的杂物屋 文章来源&#xff1a; http://racede.me/talk_about_stm32_i2c_peripheral.html 这篇文章有些历史了&#xff0c;但很经典&#xff0c;可以参考学习&#xff01; 引子 STM32的硬件I2C很多人都对它望而却步。因为很多电工都说&#xff0c;STM32 …

ST/HAL_Base—1.0 I2C主发从收非中断

一、初始化 在进行I2C初始配置时&#xff0c;主机和从机的参数必须相同&#xff0c;例如地址模式、时钟时间等等。仅从这些配置还看不出谁是主机&#xff0c;谁是从机。 // 配置都是相同的I2cHandle.Instance I2Cx;I2cHandle.Init.AddressingMode I2C_ADDRESSI…

海思hi3516ev200串口1无法输出

hi3516EV200串口1不打印输出&#xff1f; 1、首先使用命令cat /proc/tty/driver/ttyAMA查看串口是否配置好 0: uart:PL011 rev2 mmio:0x12040000 irq:20 tx:15934 rx:325 RTS|CTS|DTR|DSR|CD|RI 1: uart:PL011 rev2 mmio:0x12041000 irq:21 tx:84 rx:320 DSR|CD|RI 2: uart:P…