【工厂模式】工厂方法模式、抽象工厂模式-简单例子

简单工厂模式,请跳转到我的另一篇博客【工厂模式】简单工厂模式-简单例子-CSDN博客

四、工厂方法模式

(1)这部分还是不变,创建一个Car接口,和两个实现类。

public interface Car {void name();
}public class WuLing implements Car{@Overridepublic void name() {System.out.println("五菱");}
}public class Tesla implements Car{@Overridepublic void name() {System.out.println("特斯拉");}
}

(2)把车工厂提取成一个接口,

public interface CarFactory {Car getCar();
}public class TeslaFactory implements CarFactory{@Overridepublic Car getCar() {return new Tesla();}
}public class WuLingFactory implements CarFactory{@Overridepublic Car getCar(){return new WuLing();}
}

(3)这样的话,我再新增一种新车的时候就很方便了。

public class Mobai implements Car {@Overridepublic void name(){System.out.println("mobai");}
}public class MobaiFactory implements CarFactory{@Overridepublic Car getCar() {return new Mobai();}
}

(4)创建一个Customer类,

public class Customer {public static void main(String[] args) {Car car1 = new WuLingFactory().getCar();Car car2 = new TeslaFactory().getCar();car1.name();car2.name();Car car3 = new MobaiFactory().getCar();car3.name();}
}

这样的话,原来的类我们是没有动的,并且随时可以动态扩展,满足开闭原则。

但是实现起来反而是非常麻烦的,因为从下图的目录结构中我们也可以看出,需要创建的类变多了。

画个流程图分析一下,

总结

工厂方法模式(Factory Method Pattern)是一种创建型设计模式,它通过定义一个用于创建对象的接口,但是让子类决定实例化哪个类。这样,工厂方法模式允许一个类的实例化延迟到其子类。

在工厂方法模式中,通常会有一个抽象的工厂类,该工厂类定义了一个抽象的方法,用于创建产品对象。具体的产品创建逻辑由子类实现,每个子类负责实例化特定类型的产品。这样,客户端代码可以通过调用工厂方法来创建所需的产品,而无需关心具体的实现细节。

工厂方法模式通常包括以下角色:

  1. 抽象工厂类(Abstract Factory Class):定义了一个抽象的工厂方法,用于创建产品对象。通常是一个接口或抽象类。

  2. 具体工厂类(Concrete Factory Class):实现了抽象工厂类,负责实际创建产品对象的逻辑。每个具体工厂类对应一种产品类型。

  3. 抽象产品类(Abstract Product Class):定义了产品对象的接口或抽象类,描述了产品的公共属性和方法。

  4. 具体产品类(Concrete Product Class):实现了抽象产品类定义的接口或抽象类,是真正被创建的产品对象。

工厂方法模式的优点在于可以将对象的创建逻辑移到子类中,使得主要的工厂类更加通用,而具体的产品实现则可以灵活地扩展和变化。同时,它也遵循了开闭原则,对扩展开放,对修改关闭。

总的来说,工厂方法模式提供了一种更加灵活的对象创建方式,适用于需要根据不同情况创建不同类型对象的场景。

简单工厂模式和工厂方法模式的对比

简单工厂模式(Simple Factory Pattern)和工厂方法模式(Factory Method Pattern)是两种不同的创建型设计模式,它们在对象创建的方式和角色分配上有一些不同之处。

  1. 角色定义

    • 简单工厂模式通常只涉及一个工厂类,该工厂类负责根据客户端的请求创建具体的产品对象。
    • 工厂方法模式引入了抽象工厂类和具体工厂类,使得对象的创建逻辑更加灵活。抽象工厂类定义了一个抽象的工厂方法,而具体的产品创建逻辑则由具体工厂类实现。
  2. 创建逻辑

    • 在简单工厂模式中,工厂类通常包含一个静态方法,根据不同的参数或条件返回不同类型的产品对象。
    • 而在工厂方法模式中,每个具体的产品都有对应的具体工厂类,该类负责创建特定类型的产品对象。这样,对象的创建逻辑被分散到了多个具体工厂类中。
  3. 扩展性

    • 简单工厂模式的扩展性相对较差,如果需要添加新的产品类型,则需要修改工厂类的代码,违反了开闭原则。
    • 工厂方法模式遵循了开闭原则,因为具体的产品创建逻辑在具体工厂类中,所以可以通过添加新的具体工厂类来扩展系统,而不需要修改已有的代码。
  4. 复杂度

    • 简单工厂模式相对于工厂方法模式来说,实现起来较为简单,适用于简单的场景。
    • 工厂方法模式的实现相对复杂一些,但提供了更高的灵活性和可扩展性,适用于需要根据不同情况创建不同类型对象的复杂场景。

总的来说,简单工厂模式适用于简单的对象创建场景,而工厂方法模式更适用于复杂的场景,需要更高的灵活性和可扩展性。

五、抽象工厂模式

(1)创建一个产品接口类,和两个实现类。

public interface PhoneProduct {void start();void shutdown();void call();void sendMes();
}public class XiaomiPhone implements PhoneProduct{@Overridepublic void start() {System.out.println("小米手机开机");}@Overridepublic void shutdown() {System.out.println("小米手机关机");}@Overridepublic void call() {System.out.println("小米手机打电话");}@Overridepublic void sendMes() {System.out.println("小米手机发短信");}
}public class HuaWeiPhone implements PhoneProduct{@Overridepublic void start() {System.out.println("华为手机开机");}@Overridepublic void shutdown() {System.out.println("华为手机关机");}@Overridepublic void call() {System.out.println("华为手机打电话");}@Overridepublic void sendMes() {System.out.println("华为手机发短信");}
}

(2)创建一个路由器接口类,和两个实现类。

public interface RouteProduct {void start();void shutdown();void setting();void openWife();
}public class XiaomiRoute implements RouteProduct{@Overridepublic void start() {System.out.println("小米路由器开机");}@Overridepublic void shutdown() {System.out.println("小米路由器关机");}@Overridepublic void setting() {System.out.println("小米路由器设置");}@Overridepublic void openWife() {System.out.println("小米路由器打开wife");}
}public class HuaWeiRoute implements RouteProduct{@Overridepublic void start() {System.out.println("华为路由器开机");}@Overridepublic void shutdown() {System.out.println("华为路由器关机");}@Overridepublic void setting() {System.out.println("华为路由器设置");}@Overridepublic void openWife() {System.out.println("华为路由器打开wife");}
}

(3)创建一个抽象工厂接口,已经两个系列产品的实现类。

public interface ProductFactory {PhoneProduct phoneProduct();RouteProduct routeProduct();
}public class HuaWeiFactory implements ProductFactory{@Overridepublic PhoneProduct phoneProduct() {return new HuaWeiPhone();}@Overridepublic RouteProduct routeProduct() {return new HuaWeiRoute();}
}public class XiaomiFactory implements ProductFactory{@Overridepublic PhoneProduct phoneProduct() {return new XiaomiPhone();}@Overridepublic RouteProduct routeProduct() {return new XiaomiRoute();}
}

(4)创建一个Client类,

public class Client {public static void main(String[] args) {System.out.println("----小米产品----");XiaomiFactory xiaomiFactory = new XiaomiFactory();PhoneProduct phoneProduct = xiaomiFactory.phoneProduct();RouteProduct routeProduct = xiaomiFactory.routeProduct();phoneProduct.call();routeProduct.openWife();System.out.println("----华为产品----");HuaWeiFactory huaWeiFactory = new HuaWeiFactory();PhoneProduct phoneProduct1 = huaWeiFactory.phoneProduct();RouteProduct routeProduct1 = huaWeiFactory.routeProduct();phoneProduct1.call();routeProduct1.openWife();}
}

总结

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口用于创建相关或依赖对象的家族,而不需要指定具体类。抽象工厂模式属于工厂模式的一种扩展,它通过引入抽象工厂和具体工厂来解决工厂方法模式中只能创建单一产品的局限性。

在抽象工厂模式中,有两个关键的角色:

  1. 抽象工厂(Abstract Factory):定义了创建一系列产品的方法,每个方法对应一种产品。
  2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体的产品。

与工厂方法模式不同的是,抽象工厂模式中一个具体工厂可以创建多个不同类型的产品,这些产品之间通常有关联性,属于同一个产品族。

适用场景:

  1. 客户端(应用层)不依赖于产品类实例如何被创建、实现等细节
  2. 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码提供一个产品类的库,所有的产品以同样的接口出现,从而使得客户端不依赖于具体的实现

抽象工厂模式的优点包括:

  • 客户端与具体产品的实现相分离,客户端通过抽象工厂接口操作产品,可以方便地更换产品系列。
  • 符合开闭原则,增加新的产品族很方便,只需要增加对应的具体工厂类即可。

但是,抽象工厂模式也有一些缺点:

  • 难以支持新种类产品的变化,因为需要修改抽象工厂接口及其所有的实现。
  • 增加了系统的复杂度,引入了更多的抽象概念和类。

总的来说,抽象工厂模式适用于需要创建一系列相关或依赖对象的场景,其中产品的组合可能会变化,但产品之间的关联性固定的情况。

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

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

相关文章

贵阳市人民政府副市长刘岚调研珈和科技

4月9日,贵阳市人民政府副市长、党组成员刘岚一行到珈和科技走访调研,珈和科技总经理冷伟热情接待了考察团,就企业算力需求与合作,特色产业园区建设,科技成果转化落地等方面进行深入交流。 贵阳市教育局局长李波&#…

交换基础配置--单臂路由

1、创建vlan 创建vlan10 创建vlan10和vlan20 创建vlan1到vlan9 vlan1可以不用创建,因为交换机的所有接口默认为vlan1 本实验只需要vlan10和vlan20,以上只是介绍创建vlan的方法。 查看创建的vlan: sw2同理。接着将需要划分vlan的接口划入…

通过PyCharm平台开发Django应用程序

学会使用命令行工具开发Django应用程序是基础,不过更多的时候还是要借助平台开发工具。目前,最好的Django应用程序开发工具就是jetBrains公司推出的PyCharm平台了。 借助PyCharm开发平台,可以极大提高开发Django应用程序的效率,同…

电脑工作者缓解眼部疲劳问题的工具分享

背景 作为以电脑为主要工作工具的人群,特别是开发人员,我们每天都需要长时间紧盯着屏幕,进行代码编写、程序调试、资料查询等工作。这种持续的工作模式无疑给我们的眼睛带来了不小的负担。一天下来,我们常常会感到眼睛干涩、疲劳…

OpenHarmony 视图加载——ImageViewZoom

简介 ImageViewZoom 支持加载 Resource 或 PixelMap 图片,支持设置图像显示类型功能,支持缩放功能,支持平移功能,双击放大功能,可以监听图片大小,资源变化事件,支持清除显示图片功能。 效果展示…

Docker(七):容器监控工具(Portainer、CAdvisor)

一:轻量级可视化监控工具Portainer 可视化监控工具, 可以通过docker安装,用于管理和监控docker,基本上的docker命令都有对应的按钮来操作。 # always 表示docker重启了该容器也跟着重启 docker run -d --name portainer -p 8000:8000 -p 90…

USART(串口通信协议)

USART(串口通信协议) 【通信的目的】将一个设备的数据传输到另外一个设备,拓展硬件系统 【 通信协议】制定通信的规则,通信双方按照协议进行数据的收发 串口通信中各个参数的含义 【TX】 数据接收脚【RX】 数据发送脚【SCL】 …

Visual Components软件为您带来的价值 衡祖仿真

Visual Components具备丰富的3D仿真功能、快速建模能力、定制化应用程序逻辑和大量预定义组件库等多种特点,为自动化设备制造商、整合商、制造型公司提供简单、 快速和的设计方式,可以有效提高生产效率,并优化资源分配,避免制造过…

用户行为分析模型实践(四)—— 留存分析模型

作者:vivo 互联网大数据团队- Wu Yonggang、Li Xiong 本文是vivo互联网大数据团队《用户行为分析模型实践》系列文章第4篇 -留存分析模型。 本文详细介绍了留存分析模型的概念及基本原理,并阐述了其在产品中具体实现。针对在实际使用过程问题&#xff0…

揭秘消费增值:如何让每次购物都变得更有价值

亲爱的消费者朋友们,大家好!我是微三云周丽,今天我将和你分享一种全新的消费理念——消费增值,让你的每一次消费都变得更有价值! 在传统的消费观念中,我们通常只是单纯地用钱购买物品或享受服务&#xff0…

WideDeep

这里写目录标题 1. 背景2. 贡献3 模型结构(1)任务定义(2)The Wide Component(3)The Deep Component(4)联合训练Wide和Deep Model 4. 参考 1. 背景 (1) 广义线性回归通常被用于推荐模…

Scanpy(2)多种可视化

本篇内容为scanpy的可视化方法,可以分为三部分: embedding的散点图;用已知marker genes的聚类识别(Identification of clusters);可视化基因的差异表达; 我们使用10x的PBMC数据集(…

基于SSM的平面设计课程在线学习平台系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的平面设计课程在线学习平台系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,…

51单片机学习笔记——LED点亮

一、独立按键控制LED元器件和原理图 根据厂家给的原理图找到独立按键模块,观察下图我们知道按钮的一个头接GND,一头接IO口。由此可知我们如果需要使用第一个按钮则需要用p31。 二、独立按键控制LED程序 程序编写需要使用到IF else语句 当如果P310时P20…

盒子模型之弹性盒模型

弹性盒模型 经常适用于手机端图标布局 display: flex;让这个盒子显示成弹性盒(很适合移动端布局) 影响:1.让里面的子元素默认横向排列 2.如果子元素是行内元素,则直接变成块元素 3.只有一个元素,margin: auto;自动居中…

uni.uploadFile上传图片后台接收不到数据

今天遇到一个很奇怪的问题,通过使用uni.uploadFile上传文件时后端接收不到文件,查过很多资料,原来是自定义了header的Content-Type问题。取消即可,另把自定义文件上传的代码贴出来。 分析:当我们加上请求头的时候 不…

一步一步写线程之九线程池任务的窃取

一、介绍 在实际的工作安排中,如果有一个比较大的工作,又可以细分的,诸如有一天一万个萝卜要洗这样的工作。假如做为一个工作的分配者,怎么处理这种需求?可能每个人都会想,先看看一个人一天洗多少萝卜&…

大数据真题讲解系列——拼多多数据分析面试题

拼多多数据分析面试题:连续3次为球队得分的球员名单 问题: 两支篮球队进行了激烈的比赛,比分交替上升。比赛结束后,你有一个两队分数的明细表(名称为“分数表”)。表中记录了球队、球员号码、球员姓名、得…

CSS基础:盒子模型详解

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃,大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 We…

Liunx挂载硬件设备

一、mount命令(用于挂载文件系统) (一)语法格式:mount 参数 源设备路径 目的路径 (二)参数 1、-t:指定挂载的文件系统 (1)iso9660:光盘或光盘…