GoF23——工厂模式

news2024/9/30 5:27:32

✯ 面向对象设计原则

  • 对接口编程而不是对实现编程
  • 优先使用对象组合而不是继承

介绍说明

工厂模式(Factory Pattern)属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

作用:实现了创建者和调用者的分离;主要解决接口选择的问题。

工厂模式核心本质:

  • 实例化对象不使用new,而是用工厂方法代替
  • 将选择实现类型,创建对象统一管理和控制。从而将掉哟哦你跟着跟我们实现类解藕

三种模式:

  1. 简单工厂模式:用来生产同一等级结构中的任意产品(支持增加新产品,需覆盖已有代码)
  2. 工厂方法模式:用来生产同一等级结构中的固定产品(支持增加任意产品)
  3. 抽象工厂模式:围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂

应用场景

  1. JDK中Calendar的getInstance方法
  2. JDBC中的Connection对象的获取
  3. Spring中IOC容器创建管理bean对象
  4. 反射中Class对象的newInstance方法

简单工厂模式(静态工厂模式)

某种程度上不符合设计原则规范没,但使用它最多。

应用实例: 您需要一辆汽车,可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现(创建过程在其子类执行)

1. 定义一个车类接口

public interface Car {
    public void name();
}

2.编写两个实现类去实现Car接口,分别是:五菱汽车、大众汽车

public class WuLing implements Car{
    @Override
    public void name() {
        System.out.println("五菱汽车!");
    }
}
public class DaZhong implements Car{
    @Override
    public void name() {
        System.out.println("大众汽车!");
    }
}

3.编写一个车的工厂类,消费者从工厂里提取具体车

// 也叫静态工厂模式,不满足开闭原则,增加一个产品就要修改原代码
public class CarFactory {

    // 方式一:根据类型返回不同的car
    public static Car getCar(String type){
        if("五菱".equals(type)){
            return new WuLing();
        }else if("大众".equals(type)){
            return new DaZhong();
        }else {
            return null;
        }
    }

    // 方式二,拒绝臃肿的if else代码,相对于较好扩展,但也是增加一个产品需要改代码
    public static Car getWuLingCar(){
        return new WuLing();
    }
    public static Car getDaZhongCar(){
        return new DaZhong();
    }
}

4.测试类

/**
 简单工厂模式:用来生产同一等级结构中的任意产品(支持增加新产品,需要扩展已有代码)
 */
public class Zmain {

    public static void main(String[] args) {
        // 1.传统方式,需要去new每一个具体的实现类
        // 假设此类初始化需要很多额外的参数,那需要一个个传参数进去,代码不美观
        //Car car = new WuLing();
        //Car car2 = new DaZhong();

        // 2.使用工厂模式获取具体类,特点是只关心去工厂里拿,而不new具体实现
        Car car = CarFactory.getCar("五菱");
        Car car2 = CarFactory.getDaZhongCar();

        car.name();
        car2.name();
    }
}

5.运行结果

 

结论:简单工厂模式无非就是去工厂里获取具体类,而不是直接暴露的new具体类,消费者只在车工厂里获取具体车。

但这也有一个非常突出的缺点,假设我此时扩展一个特斯拉车辆,那每次都需要去改造CarFactory车工厂里的代码,无脑补if else代码,或者再写一个获取特斯拉车的方法,不方便横向扩展,也不符合开闭原则(对扩展开放,对修改关闭)

 

工厂方法模式

在不修改已有类的情况下,通过增加新的工厂类实现扩展

工厂方法模式是简单工厂模式的升级版本,符合开闭原则,但同样的代码维护量也更多了,核心思想是为每一个车都制造一个自己的工厂,消费者从各个工厂里提取车

1. CarFactory 类改造

/**
 * 定义一个公共factory接口,新增加一个产品去实现这个规范的工厂接口,而无需改这个接口
 */
public interface CarFactory {
    Car getCar();
}

2.每一个车都去实现公共的CarFactory类,自己搭建一个工厂类

public class WuLingFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new WuLing();
    }
}
public class DaZhongFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new DaZhong();
    }
}

此时我们扩展一个特斯拉车辆

public class Tesla implements Car{
    @Override
    public void name() {
        System.out.println("特斯拉!");
    }
}
public class TeslaFactory implements CarFactory{
    @Override
    public Car getCar() {
        return new Tesla();
    }
}

3.测试类

public class Zmain {
    public static void main(String[] args) {

        // 需要什么车,就从什么车工厂里去获取
        Car car = new WuLingFactory().getCar();
        Car car2 = new DaZhongFactory().getCar();

        car.name();
        car2.name();

        // 增加一个特斯拉车,每扩展一个产品,写一个自己的factory,而无需改原代码
        Car car3 = new TeslaFactory().getCar();
        car3.name();
    }
}

4.运行结果

结论:工厂方法模式符合开闭原则,增加新的产品不涉及修改原已存在的代码,支持横向拓展,但是从代码、结构、编程、管理四个复杂度维度来说,简单工厂模式都是最简单明了的,工厂方法模式代码量变得臃肿,根据情况场景去选择哪种模式应用。

 

 

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

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

相关文章

Java8并行流---并行数据处理与性能

Java8并行流---并行数据处理与性能0.主要内容1.并行流1.1将顺序流转换为并行流附录附录.10.主要内容 主要内容 用并行流并行处理数据 并行流的性能分析 分支/合并框架 使用Spliterator分割流 1.并行流 调用parallelStream方法来把集合转换为并行流。并行流就是一个把内容分成多…

pytorch应用(入门2) 一维线性回归

目录nn.Module(模组)torch.optim (优化)模型的保存和加载一维线性回归代码如下:均方差损失函数nn.MSELoss()model.parameters()的理解与使用torch.autograd.Variableoptimizer.zero_grad()model.eval的作用深度学习方法——pytorch下GPU与CPU…

如何设计一个好的工业产品?

许多人不知道工业设计的本质是什么?与工业设计相比,其本质是解决消费群体的相关问题,实现消费者的需求,使客户更容易选择。但是如何设计一个好的工业产品呢? 1.更加科学合理地摆脱困境 产品设计必须开拓进取。它应该能够引领时代潮流&#…

基础数学复习(2)——插值

文章目录插值和拟合的区别(了解)拉格朗日插值(必考)插值余项说不定会考的证明题拉格朗日插值缺点和适用范围(了解)牛顿插值(必考)推导差商的性质(会考)——通…

Java语法五:锁策略以及CAS

目录 1.常见的锁策略 2:Synchronized原理 2.1:加锁工作工程 2.2:其他的优化操作 2.2.1:锁消除 2.2.2:锁粗化 3.CAS 3.1:实现原子类 3.2:CAS中的ABA问题 3.2.1:什么是ABA问题 3.2.2&am…

【JavaScript】俄罗斯方块简单网页版

文章目录js制作简单网页版俄罗斯方块效果演示设计思路一、HTML网页结构代码二、CSS代码三、JS代码四、代码资源分享js制作简单网页版俄罗斯方块 程序虽然很难写,却很美妙。要想把程序写好,需要写好一定的基础知识,包括编程语言、数据结构与算…

在mac上搭建php的SNMP开发环境

前言 最近需要开发AC的snmp协议,需要开启php的snmp扩展,网上能搜索到的主要还是windows和centos下面的几篇资料。这里主要介绍下mac系统下如何搭建php的snmp开发环境。 第一步,安装php: 首先需要在mac上面安装PHP,这…

重点物联网漏洞利用情况

重点物联网 漏洞利用情况本节我们选取了两个漏洞进行分析。UPnP 相关的漏洞我们将在 4.4.3 进行分析,除去 UPnP 相关漏 洞外,被利用最多的是 Eir D1000 路由器的一个漏洞 [44](CVE-2016-10372),我们将对其进行分析。 …

第006课 - 使用vagrant快速创建linux虚拟机

使用vagrant快速创建linux虚拟机 项目中使用的环境,都是装在linux当中的,我们可以使用linux虚拟机。 https://www.virtualbox.org/ 直接双击进行安装运行。 CPU开启虚拟化 virtualbox安装需要我们的cpu开启虚拟化。 这个需要设置主板。 在开机启动的时候,找到cpu配置:…

什么是金手指,金手指的设计要求有哪些?

金手指(connecting finger)是电脑硬件如:(内存条上与内存插槽之间、显卡与显卡插槽等),所有的信号都是通过金手指进行传送的。金手指由众多金黄色的导电触片组成,因其表面镀金而且导电触片排列如…

阿里云主要产品架构介绍

文章目录前言主要产品云产品访问拓扑ECS架构RDS架构OCS架构SLB架构OSS架构OTS架构ODPS架构SLSSLS的产品视角SLS运维视角OAS结语前言 阿里云产品众多,基本涵盖了从存储到计算到网络的方方面面,当然还包括大数据和人工智能。这些产品,共同组成…

响应式原理 之 vue2 vue3

目录 一、响应式概念 二、响应式函数的实现 watchFn 三、响应式依赖的收集 四、监听对象的变化 1. vue2 2. vue3 五、对象的依赖管理 1. 图解 2. 代码 六、响应式完整代码 一、响应式概念 m有一个初始化的值,有一段代码使用了这个值那么在m有一个新的值时…

热门探讨丨SaaS软件是否正在“毁掉”数字化转型企业?

——当它浮出水面,才能看到水下的错落。 截至2021年末,我国企业的数量达到4842万户,增长1.7倍,其中99%以上都是中小企业。 根据调查,在数字化转型浪潮中,我国有超过70%的企业对数字化转型处于积极态度&am…

网络部署运维实验(pat 端口映射含命令)

♥️作者:小刘在这里 ♥️每天分享云计算网络运维课堂笔记,疫情之下,你我素未谋面,但你一定要平平安安,一 起努力,共赴美好人生! ♥️夕阳下,是最美的,绽放,…

Vue JSX 上手指南

JSX 简介 JSX Javascript XML。在 Javascript 里写 XML,同时拥有 Javascript 的灵活性和 HTML 的语义化。 Template vs JSX template 是 Vue 的默认写法,也更推荐。因为 template 语法是固定的,Vue 在编译层面为它做了很多静态标记的优化…

MySQL简介及常用引擎介绍

MySQL 由 My 和 SQL 组成,其中的 SQL 部分即为:Structured Query Language,意为结构化查询语⾔,是访问数据库的最常⻅的标准化语⾔。 MySQL 是一款优秀的、开源的数据库管理系统,同时 MySQL 也是一款可移植的数据库&a…

【WSL】[02] windows subsytem linux 配置和使用

第【2】章前言: 上一篇我们已经安装好了ubuntu在WSL下的GUI的桌面:我们现在继续进一步进行配置工作。同时也把,运用WSL的流程摸一把,以备后用。 1 在windows的PowerShell终端进行配置和查询: 1.1 查询所有支持的可以…

极小尺寸,超低功耗,高度集成,天翼物联NB-IoT云芯模组

数字经济时代,物联网已融入我们的日常生活。比如,智能抄表代替人工上门抄表,运动手环实时传输心率情况,烟感报警器远程告警……这些高科技背后都有一颗小而强大的芯片在支撑。 天翼物联云芯模组依托天翼物联网平台(AIo…

制造业项目管理软件如何帮助企业做好项目管理?

项目产品、采购、销售、BOM变更管理不全面; 项目进度追踪管理难; 项目进度款管不清、项目尾款管不到; … … 而以上仅仅是生产制造企业所面临的项目管理问题的“冰山一角”。 采用“项目制”生产模式的制造企业,需要做到项目…

理解XaaS(SaaS、Baas、Paas、Iaas)

XaaS : XX as a Service 参考原文 以电商来举例 一套电商系统需要的开发资料 产品经理:设计电商系统 前端工程师:开发页面 后端工程收:开发后端 运维工程师:搭建环境,部署到服务器,负责后期维护等 服务器…