设计模式之工厂方法模式精讲

工厂方法模式又叫虚拟构造函数(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建性工作推迟到子类中。

工厂模式可以分为简单工厂、工厂方法和抽象工厂模式。

  1. 简单工厂模式:需要注意的是,简单工厂并不包含在《GoF》一书中定义的23种设计模式,因为它过于简单,更像是一种编程习惯,并且它违反了开闭原则,增加工厂需要修改类的实现。
  2. 工厂方法模式:是简单工厂模式的进一步抽象和推广,将具体创建工作交给子类去做,避免违反开闭原则。
  3. 抽象工厂模式:如果说工厂方法模式针对的是一个产品等级结构,那么抽象工厂模式面对的就是多个产品等级结构。
    由于简单工厂模式严格来说并不算是一种设计模式,就不再画UML图了,大家通过一个例子感受一下它的用法:
public interface Shape {void draw();
}public class Circle implements Shape {@Overridepublic void draw() {System.out.println("draw a circle");}
}public class Square implements Shape {@Overridepublic void draw() {System.out.println("draw a square");}
}public class SimpleFactory {public static Shape createShape(String shapeType) {if (shapeType == null) {throw new IllegalArgumentException("Shape type cannot be null.");}switch (shapeType.toLowerCase()) {case "circle":return new Circle();case "square":return new Square();default:throw new IllegalArgumentException("Unsupported shape type: " + shapeType);}}
}public class Demo {public static void main(String[] args) {Shape circle = SimpleFactory.createShape("circle");circle.draw();Shape square = SimpleFactory.createShape("square");square.draw();Shape triangle = SimpleFactory.createShape("triangle");triangle.draw();}
}

工厂方法模式的UML图如下:

在这里插入图片描述

下面还是以一个例子来说明工厂方法模式的用法。假设有一个果农接口,相当于图中的Creator,有一个葡萄果农和一个苹果农分别实现果农接口,这两个类相当于ConcreteCreator类。然后有一个水果接口 ,相当于Product接口,一个苹果类和一个葡萄类分别实现水果接口。这时候注意体会工厂方法模式和简单工厂模式的区别,工厂方法模式把创建对象的工作分别放到葡萄果农和苹果农的类中去实现,也就是在具体类中实现。

public interface GuoNong {Fruit createFruit();
}public class GrapeNong implements GuoNong {@Overridepublic Fruit createFruit() {return new Grape();}
}public class AppleNong implements GuoNong {@Overridepublic Fruit createFruit() {return new Apple();}
}public interface Fruit {void plant();void grow();void harvest();
}public class Grape implements Fruit {@Overridepublic void plant() {System.out.println("种葡萄");}@Overridepublic void grow() {System.out.println("葡萄生长");}@Overridepublic void harvest() {System.out.println("收葡萄");}
}public class Apple implements Fruit{@Overridepublic void plant() {System.out.println("种苹果");}@Overridepublic void grow() {System.out.println("苹果生长");}@Overridepublic void harvest() {System.out.println("收苹果");}
}public class Demo {public static void main(String[] args) {GrapeNong grapeNong = new GrapeNong();Fruit grape = grapeNong.createFruit();grape.plant();grape.grow();grape.harvest();System.out.println("**************分割线**********************");AppleNong appleNong = new AppleNong();Fruit apple = appleNong.createFruit();apple.plant();apple.grow();apple.harvest();}
}

大家如果需要视频版本的讲解,可以关注下我的B站:

三、设计模式之工厂方法模式精讲

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

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

相关文章

在ubuntu上搭建系统监控系统

大纲 数据生产方安装和运行验证 数据收集、存储和分发方下载和解压修改配置运行验证 数据消费方下载和运行验证新增数据源新增看板关联看板和数据源效果展现 参考资料 在一个监控系统中,一定会有“数据生产方”和“数据消费方”存在。“数据生产方”用于产出需要监控…

企业如何利用数字人员工,加速企业数字化发展?

元宇宙概念的兴起,为企业数字化转型提供了新的想象空间,各领域企业纷纷推出高辨识度、强互动性的数字人员工、数字代言人,以数字人短视频、数字人发布会、虚拟数字人直播、AI交互数字人互动等场景,加速企业数字化进程。 建发股份数…

基于小华例程3.2版本USB之usb_dev_cdc工程深入代码详解USB过程

打开工程首先看readme文件:(官方的说明中,串口3和4不明确,根据代码和实测,确定CDC测试使用的是串口3,后文我会讲到为什么是串口3). 样例使用说明Date Author IAR MDK …

Visual Studio 2022报错c1083,win11解决办法

如果头文件报错,并且编译器报错是c1083,无法处理的时候,包括卸载重装也是无济于事的时候 此时可以采取一下办法进行修改 出现这个的主要原因是安装 Windows SDK 时版本出错,需要根据自己的 windows 版本选择安装对应版本的 Wind…

35---USB PHY---ULPI UTMI+ HSIC

视频链接 USB PHY硬件电路设计---ULPI & UTMI & HSIC 01_哔哩哔哩_bilibili USB PHY---ULPI & UTMI & HSIC 1、USB PHY基本介绍 芯片厂商开发了一些USB PHY芯片,可以把DP、DM上的差模信号转成共模信号。 USB PHY负责最底层的信号转换&#xff0…

智能资产管理:RFID技术与国产WMS系统的融合之路

随着信息技术的飞速发展,企业对于资产管理的需求也日益增长。传统的资产管理方法已无法满足现代企业的管理需求,因此,一种结合了RFID技术与国产WMS系统的智能资产管理方案应运而生。 RFID,即无线射频识别技术,通过无…

网络播放解码器 SIP-7102网络音频解码播放器

网络播放解码器 SIP-7102网络音频解码播放器 SIP-7102是一款支持SIP协议的网络音频解码播放器,具有10/100M以太网接口,其接收网络的音频数据,通过设备的DSP及放大电路,可以直接连接两路15W的扬声器。可以用于公共广播、报警系统、…

企业如何通过AARRR模型完成快速扩张?

在竞争激烈的市场环境中,企业要想实现持续的用户增长,就需要采用一套有效的策略和模型。AARRR模型→(【1日1词】AARRR用户增长模型--互联网运营经典模型)是一个帮助企业实现用户增长的有效方法。下面将详细阐述企业在营销运营过程…

macbook(m1) ubuntu下载,复制粘贴和国内镜像源配置

ubuntu下载使用 官网下载Ubuntu 22.04.4 LTS (Jammy Jellyfish) Daily Build 打开后根据电脑的架构选择安装包,想要下载其他版本也可在官网中自行搜索。 我安装时舍友说他安装的是22.04这个版本,我也就跟着他安装了 注意:下载的版本最好有…

汽车充电桩主板购买渠道汇总

随着充电桩设施的迅速普及,充电桩作为其中关键组件之一,市场需求不断增长。在互联网科技飞速发展的背景下,充电桩主板的采购渠道更加多元化,下面我们来探讨消费者、充电桩运营商和生产商可以从何处购买充电桩主板。 直接联系制造商…

通过python获取谷歌学术搜索结果

谷歌学术是重要的科研利器,搜索结果通常上千个,每次只能看几个,通过开源的接口,可以批量获取搜索结果,方便快速综合分析。 这里用到的库是scholary,可以指定获取多少个结果,每个结果是个dict&a…

蓝桥杯物联网竞赛_STM32L071_13_定时器

CubeMx配置LPTIM: counts internal clock events 计数内部时钟事件 prescaler 预分频器 updata end of period 更新期末 kil5配置: 中断回调函数完善一下: void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim){if(cnt ! 10) cnt…