创建型模式-简单工厂-工厂方法-抽象工厂

news2024/9/28 19:32:22

简单工厂模式

例题
在这里插入图片描述

uml
在这里插入图片描述

代码

package simpleFactory;  
  
import java.lang.management.OperatingSystemMXBean;  
import java.util.Scanner;  
  
//定义Person  
class Person{  
public void say(){}  
  
}  
class Man extends Person{  
public void say()  
{  
System.out.println("I am a man");  
}  
  
};  
  
class Woman extends Person{  
public void say()  
{  
System.out.println("I am a woman");  
}  
  
};  
  
class Robot extends Person{  
public void say()  
{  
System.out.println("I am a robot");  
}  
  
}  
  
//定义简单工厂  
class Factory{  
public static Person createPerson(String op)  
{  
Person person =null;  
switch (op)  
{  
case "M":  
person = new Man();  
break;  
case "W" :  
person = new Woman();  
break;  
case "R" :  
person = new Robot();  
break;  
}  
  
return person;  
}  
  
}  
  
  
  
  
public class Test {  
public static void main(String[] args) {  
System.out.println("请输入:1.M 2.W 3.R");  
Scanner sc= new Scanner(System.in);  
  
String s=sc.next();  
  
Person person = Factory.createPerson(s);  
  
person.say();  
  
}  
}

总结
简单工厂模式,工厂返回产品

工厂方法模式

例题
在这里插入图片描述

uml
在这里插入图片描述

代码

package factoryMethod;  
  
  
import java.util.Scanner;  
  
class Person{  
public void say(){};  
}  
class Man extends Person {  
public void say()  
{  
System.out.println("I am a man");  
}  
};  
  
class Woman extends Person {  
public void say()  
{  
System.out.println("I am a woman");  
}  
  
};  
  
class Robot extends Person {  
public void say()  
{  
System.out.println("I am a robot");  
}  
  
}  
  
  
//创建工厂接口  
interface Factory{  
Person createPerson();  
}  
  
class WomanFac implements Factory{  
  
@Override  
public Person createPerson() {  
return new Woman();  
}  
}  
class ManFac implements Factory{  
  
@Override  
public Person createPerson() {  
return new Man();  
}  
}  
class RobotFac implements Factory{  
  
@Override  
public Person createPerson() {  
return new Robot();  
}  
}  
  
  
  
public class Test2 {  
public static void main(String[] args) {  
System.out.println("请输入:1.M 2.W 3.R");  
Scanner sc= new Scanner(System.in);  
String op=sc.next();  
Factory fac = null;  
switch (op)  
{  
case "M":  
fac = new ManFac();  
break;  
case "W" :  
fac = new WomanFac();  
break;  
case "R" :  
fac = new RobotFac();  
break;  
}  
  
Person p=fac.createPerson();  
p.say();  
}  
}

总结
一个工厂接口,多个工厂类去实现该接口,这样可以将返回的不同产品进行不同包装

抽象工厂模式

例题
在这里插入图片描述

uml

代码

package abstractFactory;  
interface Refrigerator{  
void say();  
}  
class HaiRefrigerator implements Refrigerator{  
  
@Override  ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6f1e676ac852447db913289060c01250.png#pic_center)

public void say() {  
System.out.println("我是海尔冰箱");  
}  
}  
  
class TclRefrigerator implements Refrigerator{  
  
@Override  
public void say() {  
System.out.println("我是TCL冰箱");  
}  
}  
  
interface Television {  
void say();  
}  
class HaiTelevison implements Television{  
  
@Override  
public void say() {  
System.out.println("我是海尔电视机");  
}  
}  
class TclTelevison implements Television{  
  
@Override  
public void say() {  
System.out.println("我是TCL电视机");  
}  
}  
  
interface Factory{  
Refrigerator createRefrigerator();  
Television createTelevision();  
}  
  
class HaiFac implements Factory{  
  
@Override  
public Refrigerator createRefrigerator() {  
return new HaiRefrigerator();  
}  
  
@Override  
public Television createTelevision() {  
return new HaiTelevison();  
}  
}  
  
class TCLFac implements Factory{  
  
@Override  
public Refrigerator createRefrigerator() {  
return new TclRefrigerator();  
}  
  
@Override  
public Television createTelevision() {  
return new TclTelevison();  
}  
}  
  
  
  
  
  
public class Test3 {  
public static void main(String[] args) {  
// Factory fac=new TCLFac();  
//抽象工厂接口  
Factory fac=new HaiFac();  
//抽象产品接口  
Refrigerator refrigerator = fac.createRefrigerator();  
Television television = fac.createTelevision();  
  
refrigerator.say();  
television.say();  
}  
}

总结
有多个产品,产品分属不同类型

总结

1. 定义与目的

简单工厂模式(Simple Factory Pattern)

  • 定义:简单工厂模式又称为静态工厂方法模式,是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
  • 目的:提供一个创建对象的接口,客户端通过调用工厂类的静态方法来获取对象实例,而无需关心对象的具体创建过程。

工厂方法模式(Factory Method Pattern)

  • 定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。
  • 目的:将对象的创建与使用分离,降低客户端与具体产品类之间的耦合,提高系统的灵活性和可扩展性。

抽象工厂模式(Abstract Factory Pattern)

  • 定义:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
  • 目的:创建一系列相关或相互依赖的对象,而无需指定它们具体的类,以便在运行时动态地创建对象族。

2. 实现方式

简单工厂模式

  • 通过一个工厂类,根据传入的参数决定创建哪个类的实例。工厂类包含必要的逻辑判断,动态实例化相关的类。
  • 优点:简单、易于实现;缺点:违反了开放-封闭原则(对扩展开放,对修改封闭),因为每增加一个新的产品类都需要修改工厂类。

工厂方法模式

  • 定义一个创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化推迟到子类中进行。
  • 优点:支持增加任意产品,只需增加相应的工厂类即可,遵循了开放-封闭原则;缺点:每增加一个产品,就需要增加一个相应的工厂类,增加了系统的复杂度。

抽象工厂模式

  • 提供一个创建产品族的接口,客户端通过调用这个接口可以获取到一系列相关或相互依赖的对象的实例。
  • 优点:支持增加产品族,但不支持增加新的产品(在不修改现有工厂接口的情况下);每个工厂类都可以创建多个产品实例,形成产品族;缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。

3. 优缺点对比

简单工厂模式

  • 优点:简单、易于实现,封装了对象创建的逻辑,提高了代码的可维护性和可扩展性。
  • 缺点:违反了开放-封闭原则,增加新产品时需要修改工厂类。

工厂方法模式

  • 优点:支持增加任意产品,遵循了开放-封闭原则,提高了系统的灵活性和可扩展性。
  • 缺点:每增加一个产品,就需要增加一个相应的工厂类,增加了系统的复杂度。

抽象工厂模式

  • 优点:支持增加产品族,客户端不需要知道对象创建的细节,只需要知道产品类的共同接口。
  • 缺点:当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改,增加了系统的抽象性和理解难度。

4. 适用场景

简单工厂模式:适用于产品数量较少且变化不频繁的场景。

工厂方法模式:适用于产品种类较多且可能会频繁增加的情况,客户端只需要知道创建对象的接口,而不需要知道具体的实现类。

抽象工厂模式:适用于有多个产品系列,且产品系列中的产品需要一起使用的情况,客户端需要创建一系列相互依赖或关联的对象,且这些对象属于不同的产品族。

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

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

相关文章

Transformer是不是BERT、GPT的妈?看完就知道了

Transformer变异衍生出来了两个超强悍的预训练模型 一、Transformer模型 Transformer是近年来深度学习领域中备受瞩目的模型之一,其核心思想是通过自注意力机制和位置编码来捕捉输入序列中的长距离依赖关系。 自注意力机制让模型在处理每个输入元素时能够关注到所有…

Mac电脑上最简单安装Python的方式

背景 最近换了一台新的 MacBook Air 电脑,所有的开发软件都没有了,需要重新配环境,而我现在最常用的开发程序就是Python。这篇文章记录一下我新Mac电脑安装Python的全过程,也给大家一些思路上的提醒。 以下是我新电脑的配置&…

Java入门2——基本数据类型详解

今天我们系统学习一下Java的八种基本数据类型,和C语言有些还是不太一样的,还是要打起精神,好好学习~ 一、Java的数据类型 首先我们画个图,了解一下Java的数据类型 以上就涵盖了Java的数据类型,那么下面,我…

C语言自定义类型:联合体

目录 前言一、联合体1.1 联合体类型的声明1.2 联合体的特点1.3 相同成员的结构体和联合体对比1.4 联合体大小的计算1.5 联合体的⼀个练习 总结 前言 前面我讲到C语言中的自定义结构——结构体,其实C语言中的自定义结构不只有结构体,还有枚举和联合体&am…

交通 | 上门配送or自提点配送?最后一公里配送中的需求引导问题

编者按: 为提高最后一公里配送的效率,本文将客户激励与不确定的路线决策相结合,建立了一个两阶段随即规划问题,并开发了一种精确式的分支定界算法进行求解。 摘要: 为了提高最后一公里配送的效率,零售商…

Vue 3 文件编译流程详解与 Babel 的使用

文章目录 一、背景二、结论三、vitejs/plugin-vue 插件调试前物料准备vuePlugin 入口buildStart 方法transform 方法 四、vue/compiler-sfc 核心包parse 方法compileScript、rewriteDefault 方法compileTemplate 方法 五、整体架构六、总结参考资料 一、背景 最近正在研究 rea…

企业防泄密妙招有哪些?请记住这8招!超实用,学起来!

在古代,有云:“密者,德之高也;事以密成,语以泄败。” 这些谚语不仅是对忠诚守密的高度赞扬,更是对保密工作重要性的深刻阐述。 在现代企业中,数据泄露已成为不容忽视的严峻挑战。 如何有效防止…

MFC单按钮启停实例

单击按钮启动、停止交替切欣换 1、在1Dlg.h文件中添加代码 public:CMy1Dlg(CWnd* pParent NULL); // standard constructorBOOL m_b;2、在1Dlg.cpp文件中添加代码 CMy1Dlg::CMy1Dlg(CWnd* pParent /*NULL*/): CDialog(CMy1Dlg::IDD, pParent) { m_hIcon AfxGetApp()->Lo…

高中还来得及选择信息学奥赛赛道吗?

随着信息学奥赛(NOI)在升学中的重要性日益凸显,越来越多的学生和家长将其视为进入顶尖高校的一个重要途径。然而,很多学生可能直到高中阶段才意识到信息学奥赛的重要性,或者才开始对编程产生兴趣。于是问题出现了&…

DarkLabel2.4版本导入MOT17数据集

目录 背景导入效果MOT17数据集说明DarkLabel导入视频导入gt文件 背景 做目标追踪,目前找了一圈开源工具,发现DarkLabel还是很好用的,提供自动目标跟踪,标注很方便。 由于目标追踪我用的是bytetrack,官网是用mot17数据…

学校周赛(2)

A.Minimize! 题目 思路 本题只需要遍历c的取值&#xff0c;实时更新答案即可 代码 #include<iostream> #include<algorithm> using namespace std;void todo(){int a,b;cin>>a>>b;int ansINT_MAX;for(int ca;c<b;c){ansmin(ans,(c-a)(b-c));}co…

二叉树的前序遍历,中序遍历,后序遍历以及层次遍历(递归方式+C语言代码)

#include<stdlib.h> #include<stdio.h> #include<assert.h> //定义一个二叉树结点结构体 typedef int ElemTpye; typedef struct TreeNode {ElemTpye data;struct TreeNode* left;struct TreeNode* right; }TreeNode; //创建结点 TreeNode* createTreenode(E…

【qt】QQ仿真项目1

一览全局: QQ仿真项目 一.创建项目添加资源文件二.创建数据库三.自定义标题栏Qt类四.加载样式表标题栏按钮的搭配五.标题栏实现移动窗体六.标题栏按钮连接信号槽七.标题栏双击最大化和还原八.基类窗口实现标题栏按钮信号九.重写基类窗口绘图事件确保设置样式表生效十.用户登录界…

Spring Gateway学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

C++20中头文件concepts的使用

<concepts>是C20中新增加的头文件&#xff0c;此头文件是concepts库的一部分&#xff0c;主要用于模板编程、泛型编程。包括 1.core language concepts&#xff1a; std::same_as&#xff1a;指定一种类型(type)与另一种类型是否相同。 std::derived_from&#xff1a;指定…

学习之什么是装饰器

什么是装饰器 本质&#xff1a;就是一个函数&#xff0c;能为其它的函数增加额外功能 # 目标函数 def power_num(n):"""计算并返回1-n之间每个数的平方和:param n::return:"""total 0for i in range(1, n1):total i ** 2"""…

【网络安全】-访问控制-burp(1~6)

文章目录 前言   1.Lab: Unprotected admin functionality  2.Lab: Unprotected admin functionality with unpredictable URL   3.Lab: User role controlled by request parameter   4.Lab:User role can be modified in user profile  5.Lab: User ID controlled by…

爬虫入门 Selenium使用

爬虫入门 & Selenium使用 特别声明&#x1f4e2;&#xff1a;本教程只用于教学&#xff0c;大家在使用爬虫过程中需要遵守相关法律法规&#xff0c;否则后果自负&#xff01;&#xff01;&#xff01; 项目代码&#xff1a;https://github.com/ziyifast/ziyifast-code_inst…

systemd-analyze命令:Linux系统启动分析

一、命令简介 用途: systemd-analyze ​命令用于分析系统引导过程的时间性能。标签: 系统管理&#xff0c;性能分析。相关命令: systemd-bootchart​, systemd-cgtop​, systemd-resolve​. ‍ 二、命令参数 命令格式 systemd-analyze [OPTIONS...] COMMAND ...选项和参数…

GUI-Guider LVGL 添加自定义代码

添加自定义代码时&#xff0c;分为上线两端 1.上部分可有可无 2.下部分为你触发事件时调用的语句 具体集合下方图片 示例参考