设计模式——工厂模式(简单工厂、工厂方法、抽象工厂)

news2024/9/30 15:23:26

是什么?

工厂模式的目的是将创建对象的具体过程隐藏起来,从而达到更高的灵活性

工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式

为什么?

在Java中,万物皆是对象,我们在使用的时候这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,那么所有new的地方都需要修改一遍,这明显违背了设计原则中的开闭原则,如果我们使用工厂来生产对象,那么我们只需要和工厂打交道就好了,彻底和对象解耦,如果要更换对象,直接在工厂中更换该对象即可,达到了与该对象解耦的目的,因此工厂模式最大的优点就是:解耦

简单工厂模式

简单工厂不是一个设计模式,它更像是一种编码习惯

结构

抽象产品:定义了产品的规模,描述了产品的主要特性和功能。

具体产品:实现或者继承抽象产品的子类。

具体工厂:提供了创建产品的方法,调用者通过该方法来获取产品。

实现

产品类:

public class Car {  //汽车父类
    private String getName;
 
}
public class Tesla extends Car{   //子类-特斯拉汽车
    public Tesla() {
        System.out.println("()=>制造特斯拉汽车");
    }
}
public class Benz extends Car{  //子类-奔驰汽车
    public Benz() {
        System.out.println("()=>制造奔驰汽车");
    }
}

工厂类及用户使用:

public class SimpleFactory {
    /**
     * 。模拟简单工厂模式
     * */
    public Car getCar(String type){    //汽车“生产间”=》简单工厂
        if ("Benz".equals(type)){
            return new Benz();
        }if ("Tesla".equals(type)){
            return new Tesla();
        }
        return new Car();
    }
}
public class Customer {
    //消费者直接调用的是工厂而非对象本身,这样就将用户和创建对象的过程隔离开来了
    public static void main(String[] args) {
        SimpleFactory simpleFactory = new SimpleFactory();
        simpleFactory.getCar("Benz");
    }
}

优缺点

我们会发现,在简单工厂模式中,提供了专门的工厂类来帮助我们创建对象,实现了对象创建和用户使用的职责分离,客户端不需要知道所创建的产品类名以及创建过程只需要知道具体产品类所需要的参数即可,通过引入配置文件,可以在不修改任何客户端代码的情况下更换和增加新的具体产品类,在一定程度上提高了系统的灵活性;

但是这样做也是不符合“开闭原则的”,如果我们这个时候需要再添加一个BMW汽车,那么同样的需要去修改我们的工厂类,在产品类型较多的时候,有可能造成工厂逻辑过于复杂,不利于系统的横向扩展和维护,并且工厂类集中了所有产品的创建逻辑,如果不能正常工作那么整个系统都会受到影响

为了解决简单工厂出现的问题,引入了我们的工厂方法模式

工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象,工厂方法使一个产品类的实例化延迟到其工厂的子类;

结构

抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品;

具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建;

抽象产品:定义了产品的规范,描述了产品的主要特性和功能;

具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应;

实现

产品类:

public class Car {// 产品父类
    
}

public class Benz extends Car{  //子类产品
    public Benz() {
        System.out.println("()=>制造奔驰汽车");
    }
}
public class Tesla extends Car{   //子类产品2
    public Tesla() {
        System.out.println("()=>制造特斯拉汽车");
    }
}

抽象工厂

public interface AbstractFactoryInterface {  //抽象工厂
    Car createCar();
}

具体工厂及用户使用

public class BenzFactory implements AbstractFactoryInterface{  //具体子类工厂
    @Override
    public Car createCar() {
        return new Benz();
    }
}

public class TeslaFactory implements AbstractFactoryInterface{  //具体子类工厂2
    @Override
    public Car createCar() {
        return new Tesla();
    }
}
public class Customer {   //用户类
    public static void main(String[] args) {
        Car car = new BenzFactory().createCar();
        Car car2 = new TeslaFactory().createCar();
    }
}

那么我们这个时候还需要添加一个BMW车的话,只需要创建一个BMW类去继承Car,并且再去创建一个BMW的工厂去实现抽象工厂即可,不需要去修改原来的代码,问题即得到解决;

优缺点

用户只需要知道具体工厂的名称即可得到所要的产品,也不需要知道产品具体的类和创建过程,在系统增加新的产品的时候只需要添加具体产品类和对应具体工厂类,无需对源代码进行任何修改,满足开闭原则;

但是每增加一个产品就需要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度;

抽象工厂模式

我们前面介绍的工厂方法模式中考虑的是一类产品的生产,如车厂只生产车,畜牧场只生产动物;

这些工厂只生产同种类的产品,也就是说工厂方法模式只考虑生产同等级的产品,但是在现实生活中许多工厂都是综合型的工厂,能够生产多等级的产品,例如一个畜牧场它不仅生产动物,还生产饲料粮食,汽车厂不仅生产汽车,还生产发动机、汽车配饰等等;

因此抽象工厂模式将考虑多等级产品的生产,将同一个具体工厂所生产的位于不同等级的一组产品称为一个产品族如下:横轴是产品等级,也就是同一类产品,纵轴是产品族,也就是同一品牌的产品(产自同一个工厂);

也就是说它是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构;

抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可以生产多个等级的产品;

结构

抽象工厂:提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品;

具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建;

抽象产品:定义了产品的规模,描述的产品的主要特性和功能,抽象工厂模式中有多个抽象产品;

具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,它与具体工厂之间是多对一的关系;

实现

也就是说我们现在车厂不仅要生产车,还要生产车的配饰、配件等等;

抽象产品及具体产品

public class Engine {
    public Engine() {

    }
}

public class V12Engine extends Engine{
    public V12Engine() {
        System.out.println("这是V12发动机");
    }
}

public class V8Engine extends Engine{
    public V8Engine() {
        System.out.println("这是V8发动机");
    }
}


public class Acc {

    public Acc() {
    }
}
public class Cowhide extends Acc{
    public Cowhide() {
        System.out.println("这是牛皮坐垫");
    }
}

public class Common extends Acc{
    public Common() {
        System.out.println("这是普通坐垫");
    }
}

抽象工厂

public interface AbstractFactory {
    //抽象工厂,定义创建具体工厂的规范
    Acc createAcc();
    Engine createEngine();
}

具体工厂

public class TeslaFactory implements AbstractFactory{
    //不同的具体产品根据自己的生产需求去创建不同的对象
    @Override
    public Acc createAcc() {
        return new Cowhide();
    }

    @Override
    public Engine createEngine() {
     return new V12Engine();
    }
}

public class BMWFactory implements AbstractFactory{
    @Override
    public Acc createAcc() {
        return new Common();
    }

    @Override
    public Engine createEngine() {
        return new V8Engine();
    }
}

用户

public class Customer {
    public static void main(String[] args) {
        TeslaFactory teslaFactory = new TeslaFactory();
        teslaFactory.createEngine();
        teslaFactory.createAcc();
        System.out.println("————————————————————————");
        BMWFactory bmwFactory = new BMWFactory();
        bmwFactory.createAcc();
        bmwFactory.createEngine();
    }
}

 优缺点

当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象;

但是当产品组中需要增加一个新的产品时所有的工厂类都需要进行修改;

例如我如果想要再添加一个空调这个产品,不仅需要多一个空调的产品族,并且在抽象工厂中还需要添加一个创建空调的方法;

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

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

相关文章

(8) 支持向量机(下)(模型评估指标、ROC曲线)

文章目录 1 二分类SVC的进阶1.1 参数C的理解进阶1.2 二分类SVC中的样本不均衡问题:重要参数class_weight 2 SVC的模型评估指标2.1 混淆矩阵2.1.1 模型整体效果:准确率2.1.2 捕捉少数类的艺术:精确度,召回率和F1 score2.1.3 判错多…

【fluent】axial、radial、tangentia的含义和区别,axial/radial/tangentia coordination表达的意义

Reference 本文主要参考fluent的官方文档。 ANSYS FLUENT 12.0 User’s Guide - 31.2 Velocity Reporting Options 笛卡尔坐标系——Cartesian coordinate system 不管什么坐标系,都要讲究维数。这个维数根据问题难度确定,对于3D问题需要用三维坐…

魔兽服务端编译部署NPCBots和 Al机器人模块教程

魔兽服务端编译部署NPCBots和 Al机器人模块教程 大家好,我是艾西。在平时自己一个人玩魔兽的时候是不是会比较无聊,因为游戏机制或副本难度自己一个人无法进行快乐的玩耍。今天艾西教大家编译部署NPCBots和 Al机器人模块,直接一个人玩魔兽也…

Python研究生组蓝桥杯(省二)参赛感受

为什么参加蓝桥杯? 今年是读研的第一年,看着我简历上的获奖经历“优秀学生干部”“优秀志愿者”“优秀毕业生”......大学四年,我竟然没有一次竞赛类的经历,也没有拿得出手的项目,我陷入了深深的焦虑。 听说蓝桥杯的…

FLstudio21支持中文语言及水果最新版本功能特点

水果的话,我用的版本是去年刚更新的FLstudio21,目前支持中文挺友好的,算很新的版本了。打开软件进入主界面,会看到如下图所示。FL Studio 21版不仅拥有非常多的音频编辑功能,而且这款软件还内置了丰富多样的插件&#…

云服务器部署python项目

前言:相信看到这篇文章的小伙伴都或多或少有一些编程基础,懂得一些linux的基本命令了吧,本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python:一种编程语言&…

每天一道算法练习题--Day19 第一章 --算法专题 --- ----------回溯

回溯 回溯是 DFS 中的一种技巧。回溯法采用 试错 的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可…

创建线索二叉树

创建线索二叉树 一、创建线索二叉树一、案例1、前序线索二叉树2、中序线索二叉树3、后序线索二叉树 一、创建线索二叉树 现将某结点的空指针域指向该结点的前驱后继,定义规则如下: 若结点的左子树为空,则该结点的左孩子指针指向其前驱结点。…

【开源项目】Build your own X 构建自己的项目

【开源项目】Build your own X 构建自己的项目 简介 Build your own X 是一个精心收集了大量资源的项目指南,可以通过从头开始重新创建我们最喜爱的技术来掌握编程。 项目地址: https://github.com/codecrafters-io/build-your-own-x这些项目里的资源…

剑指 Offer II 052——展平二叉搜索树

文章目录 题目详情示例1示例二 方法一:中序遍历之后生成新的树Java完整代码实现 方法二:在中序遍历的过程中改变节点指向Java完整代码实现 题目详情 剑指 Offer II 052——展平二叉搜索树 给你一棵二叉搜索树,请 按中序遍历 将其重新排列为一…

Matlab2012a的图像处理工具箱的imshow函数

在处理图片文件时,除了使用matlab自带的image函数,还可以考虑用matlab的图像处理工具箱。这个工具箱提供了imshow和imtool两个函数,可实现图片的显示。 这两个函数都支持Handle Graphics体系结构,它们可创建图像对象,…

【AWS入门】AWS CICD

目录 一 .TASK二. 环境准备IAM创建存储库ec2-repoec2-wp 三. Code Deploy创建应用程序创建部署组创建管道部署后的ec2-wp 一 .TASK 创建2台EC2实例,一台名为「ec2-repo」,用作开发环境,将编写好的代码提交至repository(需安装git)&#xff0…

二十六、ISIS技术总结

文章目录 ISIS 概述一、路由协议总结1、路由优先级2、分类 二、ISIS 协议特点1、特点2、ISIS 路由器的种类 三、ISIS 配置1、基础配置2、network-entity含义3、router id 和系统id转换规则 四、ISIS 开销计算1、Narrow 模式2、Wide 模式 五、 ISIS 和 OSPF 的区别 ISIS 概述 I…

TortoiseGit提示No supported authentication methods available异常

TortoiseGit他属于git的客户端,可有可无,说白了就是将git命令给我们整理成了可直接操作的按钮。 本地代码是使用了SSH的方式去拉取的代码,但是通过TortoiseGit pull代码的时候发生了如下异常,而GitBash却可以正常使用。 TortoiseG…

机器学习技术-激活函数

激活函数 作用 f(*)称为激活函数或激励函数(Activation Function),激活函数的主要作用是完成数据的非线性变换,解决线性模型的表达、分类能力不足的问题;如果网络中都是线性变换,则多层网络可以通过矩阵变换&#xf…

C6678学习-EDMA

文章目录 1、简介1. EDMA3概述2、EDMA3的组成3、EDMA3的工作流程4、EDMA3通道控制器(EDMA3CC)5、触发方式 2、EDMA3的传输1、传输数据块的定义2、传输类型3、参数PaRAM4、通道5、OPT参数 3、补充1、EDMA3通道控制器区域 1、简介 1. EDMA3概述 基于C66x…

车载滤波器组件焊锡开裂失效分析

案例背景 车载滤波器组件在可靠性试验后,主板上的插件引脚焊点发生开裂异常。 分析过程 焊点外观 说明:插件器件引脚呈现出明显的焊点开裂状态。 X-RAY检测 针对异常焊点的X-RAY检测: 说明:通孔(支撑孔)的透…

如何用ChatGPT做项目管理?

ChatGPT可以通过创建和维护跨团队项目协作计划,让员工更容易理解他们的角色和职责。这个协作计划里面会包括每个团队或个人要执行的具体任务,每个任务最后期限和任何事情之间的依赖关系。 该场景对应的关键词库:(24个&#xff09…

springboot框架开发医院云HIS 住院医生站、住院护士站功能实现

住院医生站主模块:包括医嘱管理、病案首页、分配入科、住院清单、我的质控等子模块 (1)医嘱管理功能简介 ①住院患者开立医嘱、支持医嘱复制、停止、作废等操作; ②医嘱类型含药品、项目、材料、嘱托; ③支持住院各…

(2022 IV) RCBEV

这篇是清华大学发表在IV(IEEE Transactions on Intelligent Vehicles)上的文章: Bridging the view disparity between radar and camera features for multi-modal fusion 3d object detection 文章信息讲得比较细致,非常值得一看&#xff…