工厂模式(工厂方法和简单工厂模式)

news2024/9/23 11:21:51

工厂模式

  • 概述
  • 常见分类
  • 简单工厂模式
      • 概述
      • 设计
      • 图解
      • 创建People抽象类(产品说明书)
      • 创建子类(产品角色)
      • 创建工厂(用于根据需求实例化对象)
      • 消费者
      • 简单工厂模式优点
      • 简单工厂模式缺点
  • 工厂方法模式
      • 概述
      • 设计
      • 图解
      • 创建抽象父类(产品说明书)
      • 子类(产品角色)
      • 工厂
      • 工厂接口实现类(车间)
      • 消费者
      • 优点
      • 缺点

概述

我们一般通过new创建对象,创建对象时根据需求通过构造函数对对象的属性值进行初始

化。

第一:如果需求过多,会在构造函数中进行大量初始化的操作,导致代码过多可读性降低。

第二:假如需要创建大量属性name='张三’的Student对象时,每次创建都会去设置属性值。

按照实际生活中来说,如果某种东西需求达到一定程度时,就要施行量产,就需要工厂来实现此操作

常见分类

简单工厂模式

概述

People zhangsan = new People("张三",18,'男');
People zhangsan2 = new People("张三",18,'男');
People zhangsan3 = new People("张三",18,'男');
当大量需要创建"张三"这个对象时,就需要一个工厂来代替我们去生产张三这
个对象
设计:
1.将People声明为抽象类
2.创建张三这个类继承该类,通过父类构造器初始化属性值
3.同样地,要实例化一个李四对象,就创建李四这个类继承People类

在现实生活中,工厂生产东西需要说明书,以及根据说明书设计出来的产
品称之为产品角色,再交给工厂生产,最后满足消费者的需求。 在Java的
工厂设计模式中,可以理解为以下这样关系。

设计

说明书------>抽象父类
产品角色---->抽象父类子类
工厂------>用于创建子类对象的类

图解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L1Te0m1T-1688825705455)(E:\myapp\typora\笔记文件夹\java第二阶段\新特性_images\工厂模式.png)]

创建People抽象类(产品说明书)

public abstract class People {
private String name;
private int age;
private char sex;
private People() {
}
public People(String name, int age, char sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
   }
}

创建子类(产品角色)

public class Lisi extends People {
public Lisi(){
super("李四",20,'女');
  }
}
public class ZhangSan extends People {
//初始化属性
public ZhangSan(){
super("张三",18,'男');
  }
}

创建工厂(用于根据需求实例化对象)

public class PeopleFactory {
//造产品
public People createPeople(String order){
switch (order){
case "zs":
return new ZhangSan();
case "lisi":
return new Lisi();
default:
System.out.println("没有该产品!");
return null;
    }
  }
}

消费者

public class Consumer {
public static void main(String[] args) {
//创建工厂对象
PeopleFactory p = new PeopleFactory();
//需要张三
People zhangsan = p.createPeople("zs");
System.out.println(zhangsan);
//需要李四
People lisi = p.createPeople("lisi");
System.out.println(lisi);
  }
}

简单工厂模式优点

简单工厂模式提供专门的工厂类用于创建对象,实现了对象创建和使用的

职责分离, 客户端不需知道所创建的具体产品类的类名以及创建过程,只

需知道具体产品类所对应的参数即可。

简单工厂模式缺点

需要其它对象时比如 王五,赵六…等对象,也要重复执行上述操作,会大

量创建类,同样地每次添加新产品就需要修改工厂类。在产品类型较多

时,有可能造成工厂逻辑过于复杂,不利于系统的扩展维护。
我们不仅开放了扩展,还开放了修改,这样就违反了 开放 - 封闭 原则。

工厂方法模式

概述

工厂方法模式将工厂抽象化,并定义一个创建对象的接口。每增加
新产品,只需增加该产品以及对应的具体实现工厂类,由具体工厂类决定
要实例化的产品是哪个,在子类中将对象进行创建,这样工厂的设计就符
合“开闭原则”了,扩展时不必去修改原来的代码。

设计

产品说明书(抽象父类)
产品角色(子类)
工厂(工厂接口)
车间(工厂接口实现类—创建对象)
客户

图解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZwxjLc4-1688825705456)(E:\myapp\typora\笔记文件夹\java第二阶段\新特性_images\工厂方法模式.png)]

工厂方法模式相对于在简单工厂模式来说,将工厂进行了改造:简单工厂模
式相当于将所有的产品放在一条流水线上生产,而工厂方法模式设置了产
品车间(每个工厂实现类),每个车间生产不同产品相当于多条流水线各自生
产不同的产品。当我们要增加一个产品时,只需加一个车间即可(创建一个
工厂实现类),不会改变整个工厂的结构。

创建抽象父类(产品说明书)

abstract public class Phone {
private String type;
private int ram;
private String handler;
public Phone() {
}
public Phone(String type, int ram, String handler) {
this.type =type;
this.ram = ram;
this.handler = handler;
}
@Override
public String toString() {
return "Phone{" +
"type='" + type + '\'' +
", ram=" + ram +
", handler='" + handler + '\'' +
'}';
   }
}

子类(产品角色)

public class Apple extends Phone {
public Apple(){
super("苹果50Pro Max",64,"A100");
  }
}
public class HUAWEI extends Phone {
public HUAWEI(){
super("p100",128,"天玑200000");
  }
}

工厂

//工厂
public interface PhoneFactory {
//产品线---造手机
Phone createPhone();
}

工厂接口实现类(车间)

//造苹果的车间
public class AppleFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new Apple();
  }
}
//造华为的车间
public class HUAWEIFactory implements PhoneFactory {
@Override
public Phone createPhone() {
return new HUAWEI();
  }
}

消费者

public class Consumer {
public static void main(String[] args) {
//创建华为工厂对象
HUAWEIFactory huawei = new HUAWEIFactory();
//创建苹果工厂对象
AppleFactory apple = new AppleFactory();
//造华为
Phone p1 = huawei.createPhone();
System.out.println(p1);
//造苹果
Phone p2 = apple.createPhone();
System.out.println(p2);
  }
}

优点

更符合开-闭原则,新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可。

符合单一职责原则,每个具体工厂类只负责创建对应的产品。

工厂模式是简单工厂模式的进一步抽象和拓展,保留了简单工厂的封装优点同时,让扩展变得简单,让继承变得可行。

使用这种设计方式后,当新创建一个抽象父类的子类时,只需再创建一个实现工厂接口的实现类用于创建子类对象即可。

缺点

一个工厂只能创建一种对应的具体产品。

添加新产品时,除了增加新产品类外,还要具体工厂类,系统类的个数将成对增加,增加了系统的复杂度。

由于考虑到系统的可扩展性,需要引入抽象层,增加了系统的抽象性和理解难度。

要更换另外一种产品,仍然需要修改实例化的具体工厂类。

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

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

相关文章

数据结构二叉树(OJ)题

分析: 2. 我们要想办法区分,从队列当中出队的数据是属于那一层的数据 3. 我们当前这一道题的时间复杂度是O(h * N) h是树的高度,我们最坏情况就是在树的最底下找到,得递归h次,树的高度&#x…

vue开发:vue的插槽功能讲解

vue的插槽 举一个生活中的例子:比如装修房子的时候我们会在很多地方预留出一些插孔,可能要插电冰箱,插电式,插充电器等,反正就是你觉得预留在这个位置的插座一定有用,这个预留的插座就类似我们今天要说的插…

【C语言13】结构体的声明,定义与结构体的内存对齐

文章目录 一、结构体1.1结构体是什么1.2结构体声明1.3结构体的内存 以上便是结构体的介绍,如有不足,请多多指正! 一、结构体 1.1结构体是什么 通俗的说,结构体就是一个类的集合,如同整形数组是整形数字的集合体&…

高数中的驻点以及要注意的事项

在高等数学中,驻点是指函数导数为零的点,即函数的极值点或拐点。在求解函数的最大值、最小值或拐点时,需要找到函数的驻点。 要注意以下几点: 1. 导数为零不一定是驻点:虽然驻点定义为函数导数为零的点,但…

力扣 | 双指针技巧

前文回顾:力扣 | 数组和字符串简介 力扣LeetBook:数组和字符串 文章目录 📚双指针技巧:情形一👉反转字符串👉数组拆分I👉两数之和 II - 输入有序数组 📚双指针技巧:情形二…

基于智能手机的医院服务客户端设计与实现(论文+源码)_kaic

摘 要 近年来,随着中国经济的迅猛发展,医疗技术水平也在不断提高,但由于人口数目巨大,导致医疗资源人均分配不足的情况依旧十分严峻。预约挂号一直是制约医疗机构服务质量提高的主要环节之一。在传统预约挂号方式下,繁…

EMQ X(3):客户端websocket消息收发

在EMQ X Broker提供的 Dashboard 中 TOOLS 导航下的 Websocket 页面提供了一个简易但有效的WebSocket 客户端工具,它包含了连接、订阅和发布功能,同时还能查看自己发送和接收的报文数据,我们期望 它可以帮助您快速地完成某些场景或功能的测试…

ncm格式如何转换为mp3,分享几个方法!

你是否曾在网易云音乐上下载了一些NCM格式的音频文件,但发现无法在其他设备上播放?别担心,记灵在线工具可以帮助你将这些NCM格式转换为常见的MP3格式。今天小编就来分享三种方法,教你如何搞定! 方法一:曲线…

C#学习之路-循环

有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次执行一个…

Notepad++设置查看函数列表的快捷键

Notepad是一个非常精巧、启动便捷、支持文本自动补全的记事本软件,到2023年7月,已经更新到了v8.5.4版本,这里介绍设置其查看函数列表的快捷键方法。老版本的Notepad,比如Notepad v7.3, 默认查看函数列表的快捷键的为F8&#xff0c…

python PYQT5 键盘,鼠标,绘制,焦点,改变,输入法,事件的方法和使用例子

https://img-blog.csdnimg.cn/7630017d3ee444eab9bdedf8d48d575f.png from PyQt5.Qt import * import sys class MyQwidget(QWidget):def __init__(self):super().__init__()def showEvent(self, a0) -> None:print("窗口被展示出来",a0)def closeEvent(self,a0) …

网络编程4——传输层TCP协议的三大安全机制:三次握手四次挥手+确认应答机制+超时重传机制

文章目录 前言一、TCP协议段与机制TCP协议的特点TCP报头结构TCP协议的机制与特性 二、TCP协议的 连接管理机制 TCP建立连接:三次握手 TCP断开连接:四次挥手 三、TCP协议的 确认应答机制 四、TCP协议的 超时重传机制 总结 前言 本人是一个刚刚上路的I…

快速入门QT大法

QT大法 个人博客地址:https://zjxweb.github.io/#/ 1. 入门介绍 1.1 版本控制工具 svn vss git 1.2 QT 优点 跨平台接口接单,容易上手一定程度上简化了内存回收 2. 创建第一个QT程序 2.1 流程 点击创建项目后,选择项目路径以及给项目…

计算机体系结构基础知识介绍之指令集并行的基本编译器技术(循环展开、基本管道调度)

一、基本管道调度和循环展开 为了保持管道满载,必须通过查找可以在管道中重叠的不相关指令序列来利用指令之间的并行性。 为了避免流水线停顿,相关指令的执行必须与源指令分开一定的时钟周期距离,该距离等于该源指令的流水线延迟。 编译器执…

linux内核TCP/IP源码浅析

目录 数据接收流程图硬件层网络层ip_rcvip_rcv_coreip_rcv_finish 和 ip_rcv_finish_coreip_local_deliverip_local_deliver_finish 和 ip_protocol_deliver_rcu 传输层tcp_v4_rcvtcp_v4_do_rcvtcp_rcv_state_processtcp_rcv_establishedtcp_recvmsg 数据结构socketsocksock_co…

允许Traceroute探测漏洞和ICMP timestamp请求响应漏洞解决方法(三)

目录 服务器检测出了漏洞需要修改 1.允许Traceroute探测漏洞解决方法 2、ICMP timestamp请求响应漏洞 服务器检测出了漏洞需要修改 1.允许Traceroute探测漏洞解决方法 详细描述 本插件使用Traceroute探测来获取扫描器与远程主机之间的路由信息。攻击者也可以利用这些信息来…

Chapter 3: Conditional | Python for Everybody 讲义笔记_En

文章目录 Python for Everybody课程简介Chapter 3: Conditional executionBoolean expressionsLogical operatorsConditional executionAlternative executionChained conditionalsNested conditionalsCatching exceptions using try and exceptShort-circuit evaluation of lo…

从零开始simulink自定义代码生成----自定义硬件驱动库文件(3)

文章目录 前言C mex文件mdlInitializeSizesmdlInitializeSampleTimesmdlOutputsmdlTerminatemdlRTWc文件结尾编译c文件 tlc文件Start函数Outputs函数模型及生成的代码 总结 前言 在很早的时候,做过一些Simulink自定义硬件驱动库的相关探索,但是后面没有…

惊喜!Alibaba架构师终于发布“微服务架构与实践”文档

前言: 对于微服务架构的概念,相信大家应该都不陌生,无论使用 Apache Dubbo、还是 Spring Cloud,都可以去尝试微服务,把复杂而庞大的业务系统拆分成一些更小粒度且独立部署的 Rest 服务。 但是这个过程,具…

单表查询练习

查看表的字符集编码 show create table tbname; 查看系统默认字符集 SHOW VARIABLES LIKE character_set_database; 显示所有可用的字符集 SHOW CHARACTER SET; 修改系统默认字符集 ①在 /etc/my.cnf 文件中的 [mysqld] 下添加: ②重启数据服务 systemctl re…