工厂模式详解

news2024/11/16 18:57:28

工厂模式

工厂模式顾名思义就是生产实例的工厂,使用工厂模式不会在程序中使用new关键字创建实例。而是将创建对象的细节隐藏,对外提供统一的方法,外部通过该方法获取实例。以此降低调用者与程序之间的耦合性,更加灵活

工厂模式可以分为三类

  1. 简单工厂模式
  2. 工厂方法模式
  3. 抽象工厂模式

简单工厂模式

定义一个接口,将创建对象和其本身的业务分离解耦,如下示例:

public interface Pet {
    void shout();
}
public class Cat implements Pet{
    public void shout() {
        System.out.println("猫叫");
    }
}
public class Dog implements Pet{
    public void shout() {
        System.out.println("狗叫");
    }
}
// 宠物工厂
public class PetFactory {
    // 方式一
    public static Pet getPet(String pet) {
        if (pet.equals("小猫")) {
            return new Cat();
        } else if (pet.equals("小狗")) {
            return new Dog();
        } else {
            return null;
        }
    }

    // 方式二
    public static Pet getCat(){
        return new Cat();
    }
    public static Pet getDog(){
        return new Dog();
    }
}
// 用户类
public class Customer {
    public static void main(String[] args) {
        Pet pet = PetFactory.getPet("小猫");
        pet.shout();
    }
}
// 输出 : 猫叫

如上述代码所示,创建对象只需要直接调用PetFactory工厂的创建方法即可,根据用户需求来创建指定对象,执行对应方法

工厂方法模式

工厂方法模式相对于简单工厂,提高了拓展性,可以在不影响原有类的情况下实现横向扩展其他类,但是代码量加大,可能会产生更多的代码冗余。

我们针对每一个类都为其设置单独的工厂,即每个工厂只生产一种类型,如果在需要新增其他类型那么只需要创建其工厂提供获取实例方法即可

public interface Pet {
    void shout();
}
public class Cat implements Pet {
    public void shout() {
        System.out.println("猫叫");
    }
}
public class CatFactory {
    public static Pet getCat(){
        return new Cat();
    }
}
public class Customer {
    public static void main(String[] args) {
        Pet cat = CatFactory.getCat();
        cat.shout();
    }
}

使用工厂方法模式可以再不修改原有代码的基础上继续扩展,但是工作量较大

对比简单工厂和工厂方法模式:就代码和结构的复杂度,使用简单工厂模式更加简便,但是对于可拓展性则工厂方法模式更加优越

抽象工厂模式

抽象工厂用于常见一系列相关对象的家族,抽象的意思是,我们会定义一个工厂接口并且不做任何实现,只用来约束它的实现工厂生产产品的规范。
四大核心:抽象工厂、具体工厂、抽象产品、具体产品

以华为、小米生产手机和电视为例:
在这里插入图片描述
代码如下:

// 工厂接口
public interface ProductFactory {
    RouterProduct getRouter();  // 生产路由器
    PhoneProduct getPhone();   // 生产手机
}
// 手机、路由器接口
public interface PhoneProduct { void close();}
public interface RouterProduct {void start();}
// 工厂
public class HuaweiFactory implements ProductFactory{
  public RouterProduct getRouter() {return new HuaweiRouter();}
  public PhoneProduct getPhone() {
    return new HuaweiPhone();
  }
}
public class XiaoMiFactory implements ProductFactory{
  public RouterProduct getRouter() {
    return new XiaoMiRouter();
  }
  public PhoneProduct getPhone() {
    return new XiaoMiPhone();
  }
}
// 测试
public static void main(String[] args) {
  // 拿到工厂对象
  XiaoMiFactory miFactory = new XiaoMiFactory();
  HuaweiFactory huaweiFactory = new HuaweiFactory();
  // 小米工厂生产
  PhoneProduct miFactoryPhone = miFactory.getPhone();
  miFactoryPhone.close();
  RouterProduct router = miFactory.getRouter();
  router.start();
  // 华为工厂生产
  PhoneProduct phone = huaweiFactory.getPhone();
  phone.close();
  RouterProduct router1 = huaweiFactory.getRouter();
  router1.start();
}

还有其他的产品接口实现类,华为手机、小米手机、华为路由器等等

同样的抽象工厂模式也可以进行扩展但是比较繁琐,需要再顶级工厂也就是工厂接口中去扩展,但是扩展之后其所有的实现类也都需要完成实现。如果是长期稳定状态下可以这样扩展,但是经常改动的话抽象工厂模式就显得非常鸡肋

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

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

相关文章

ccc-Brief Introduction of Deep Learning-李宏毅(6)

文章目录Three Steps for Deep LearningFully Connect Feedforward NetworkMatrix OperationOutput Layer as Multi-Class ClassifierExample ApplicationNeural NetworkGoodness of functionPick the best functionThree Steps for Deep Learning 与机器学习三步骤基本相同。 …

sql的case when用法详解

简单CASE WHEN函数: CASE SCORE WHEN A THEN 优 ELSE 不及格 END CASE SCORE WHEN B THEN 良 ELSE 不及格 END CASE SCORE WHEN C THEN 中 ELSE 不及格 END等同于,使用CASE WHEN条件表达式函数实现: CASE WHEN SCORE A THEN 优WHEN SCORE …

数据存储领域的“归档Archive”

档案圈的朋友想必对档案领域的“归档”一词已经耳熟能详,按照DA/T 58-2014《电子档案管理基本术语》中的定义,归档(Archiving)是指“按照国家规定将具有保存价值的电子文件及其元数据的保管权交给档案部门的过程”。 今天我们要聊…

FreeRTOS任务通知 | FreeRTOS十二

目录 说明: 一、任务通知 1.1、什么是任务通知 1.2、任务通知优势与劣势 1.3、任务通知值的更新方式 1.4、任务通知值状态 1.5、任务通知状态 1.6、任务通知方式类型 二、任务通知相关API函数 2.1、常用的发送通知API函数 2.2、带通知值的发送通知函数 …

STL中重要容器vector总结

你要尽全力保护你的梦想。那些嘲笑你的人,他们必定会失败,他们想把你变成和他们一样的人。如果你有梦想的话,就要努力去实现。 ——《当幸福来敲门》引言:C中STL里面的容器用法很巧妙,可以解决很多复杂的模型&#xff…

LEADTOOLS 22.0.6 UPDATE-Crack

OCR SDK 库 许多 OCR 增强功能 LEAD 行业领先的人工智能 OCR SDK 在以下方面获得了显着的识别优化:斜体、大写和小写字母、文本行组装和单词构建、列检测、基线检测和文本行分割。 LEADTOOLS为.NET 6、. NET Framework、Xamarin、UWP、C#、VB、C/C、Java、Objective…

OpenCV形态学处理

OpenCV形态学处理1、膨胀2、腐蚀3、开/闭运算4、示例膨胀、腐蚀、开运算、闭运算 1、膨胀 膨胀就是求局部最大值的操作,膨胀的数学表达式: dst⁡(x,y)max⁡(x′,y′):1ement⁡(x′,y′)≠0src⁡(xx′,yy′)\operatorname{dst}(x, y)\max _{\left(x^{\pr…

搭建mysql主从复制

前言: 👏 作者简介:我是笑霸final,一名热爱技术的在校学生。 📝 个人主页:个人主页1 || 笑霸final的主页2 📕 系列专栏:数据库 📧 如果文章知识点有错误的地方&#xff0…

缺失数据的处理

1:方括号里写数组,是对行进行操作,方括号里写字符串,是对列进行操作 dfdf.sort_values(byCount_AnimalName,ascendingFalse) #print(df.head(5)) print(df[:20]) print(df[Row_Labels]) print(type(b))2:t3.loc(定位取…

程序的编译与链接(预处理详解)+百度面试笔试题+《高质量C/C++编程指南》笔试题

本篇重点介绍程序的编译与链接过程中的预处理阶段,将详细的介绍在预处理阶段会发生什么,以及讲解有关百度该内容的面试笔试题和源于《高质量C/C编程指南》的笔试题。一.【预处理详解】①预定义符号②#define2.1 #define 定义标识符注意:2.2 #…

常见的EMC问题

电磁兼容设计的目的就在于满足产品功能要求、减少调试时间,使产品满足电磁兼容标准的要求,并且使产品不会对系统中的其它设备产生电磁干扰。 电磁兼容设计中常见的问题有哪些? 1、电磁兼容设计可以从电路设计(包括器件选择&…

69. open函数—打开文件并返回文件对象

69. open函数—打开文件并返回文件对象 文章目录69. open函数—打开文件并返回文件对象1. open() 函数的作用2. open函数语法参考3. open()函数参数说明1. file参数2. encoding 参数3. errors参数4. mode参数4. mode参数详解1. 准备工作2. w 写入模式3. a 追加模式4. r 只读模式…

RabbitMQ学习总结(10)—— RabbitMQ如何保证消息的可靠性

一、丢失场景 RabbitMQ丢失的以下3种情况: (1)生产者:生产者发送消息至MQ的数据丢失

布隆过滤器的使用

目录说明使用布隆过滤器使用测试Java 本地使用布隆过滤器Java集成Redis使用布隆过滤器说明 布隆过滤器是用来防止缓存穿透的,我们需要知道如何使用布隆过滤器。 使用 Google 的 Guava 库提供了使用布隆过滤器的 API 类(BloomFilter.class)&…

ubuntu 创建raid5教程

1、查看磁盘:parted -l 2、安装创建raid工具mdadm: sudo apt install mdadm 3、创建命令: sudo mdadm -Cv /dev/md0 -l5 -n3 /dev/sdb /dev/sdc /dev/sdd 说明: -Cv: 创建一个阵列并打印出详细信息 /dev/md0: 阵列名称 -l5: 指定阵列类型为 R…

Linux管道排序命令:sort、wc、uniq

sort 它可以根据不同的数据形式来排序,例如数字与文字的排序就不一样。此外,排序的字符与语系的编码有关,因此我们需要排序时,建议使用LANGC来让与系统统一,数据排序比较好一些 sort 【-fbMnrtuk】【file or stdin】 …

java: 错误: 不支持发行版本 5(快速解决办法)

目录 前言 一、出现报错 二、报错的原因 三、解决办法 四、解决成功 前言 在maven web项目上面要部署运行tomcat时候,会出现这个问题 一、出现报错 java: 错误: 不支持发行版本 5 二、报错的原因 (1)官方解释:这个错误…

解决1130-Host‘ ‘is not allowed to connect to this MySQL server,实现远程连接本地数据库

在使用Navicat远程连接本地数据库时,遇到了这样一个问题,我使用 本地主机的地址,连接本地的数据库,报错host ‘’ is not allowed to connect to this mysql server。上网上查了一下资料,原来自己安装在本地的mysql默认…

Netty 学习笔记——概念篇

Netty Home Netty GitHub Netty简介 Netty是由JBOSS提供的一个java开源框架,现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说,Netty 是一个…

Java——聊聊JUC中的ThreadLocal

文章目录: 1.什么是ThreadLocal? 1.1 api介绍 1.2 最简单的案例认识ThreadLocal 1.3 线程池结合ThreadLocal案例 2.Thread &ThreadLocal & ThreadLocalMap 3.ThreadLocal内存泄漏问题 3.1 四大引用之强引用 3.2 四大引用之软引用 3.3 四…