工厂模式详情

一.介绍工厂模式的用途与特点

  • 工厂方法模式是一种创建型设计模式, 其在父类中提供一个创建对象的方法, 允许子类决定实例化对象的类型。
  • 定义工厂方法模式(Fatory Method Pattern)是指定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行
    工厂模式是一种常用的设计模式,它用来封装对象的创建过程,以便在程序中随时根据需要生成对象的实例。在工厂模式中,我们将对象的创建过程封装在一个工厂类中,客户端无需关心对象的创建过程,只需要调用工厂类的方法即可获取到想要的对象。
    工厂模式常见的有三种形式:简单工厂模式、工厂方法模式和抽象工厂模式。

二.简单工厂模式

在这里插入图片描述

使用后:
在这里插入图片描述

1. 基本介绍

简单工厂模式是最基本的工厂模式,它通过一个工厂类来创建不同类型的对象,而客户端只需要传递不同的参数给工厂类即可获得不同类型的对象实例。简单工厂模式有三个角色:工厂类、抽象产品类和具体产品类。其中,工厂类负责创建不同类型的对象,抽象产品类定义了产品的公共接口,具体产品类则实现了不同类型产品的具体生产过程。

2. 传统的方式的改进

例子:
比如我们这时要新增加一个Pizza的种类(Pepper披萨),我们需要做如下修改.
改进的思路分析 :
分析:修改代码可以接受,但是如果我们在其它的地方也有创建Pizza的代码,就意味着,也需要修改,而创建Pizza的代码,往往有多处。
思路:把创建Pizza对象封装到一个类中,这样我们有新的Pizza种类时,只需要修改该类就可,其它有创建到Pizza对象的代码就不需要修改了。(简单工厂模式)

3. 项目应用-i18n国际演示

语言的切换

public class Software {
    public static void main(String[] args) {
        I18n i18n = I18NFactory.getI18NObject("china");
        System.out.println(i18n.getTitle());
    }
}
public interface I18n {
        public String getTitle();
public class I18NFactory {
    public static I18n getI18NObject(String area){
        if (area.equals("china")){
            return new Chinese();
        }else if (area.equals("spain")){
            return new Spainish();
        }else if (area.equals("italy")) {
            return new Italian();
        } else {
            return null;
        }
    }
}
public class Spainish implements I18n{
    public String getTitle(){
        return "Sistema de gestion del personal";
    }
}
public class Italian implements I18n{
    public String getTitle(){
        return "Sistema della direzione del personale";
    }
}
public class Chinese implements I18n{
    public String getTitle(){
        return "人事管理系统";
    }
}

好处:功能与功能之间更加明确,之间的耦合度降低

4. 简单工厂模式的优缺点

优点是实现了对象创建和使用的职责分离,c端不需要知道创建产品的具体过程,在不修改任何代码的情况下可以增加新的具体产品类
缺点是违反了设计模式的ocp原则,即对扩展开放,对修改关闭。即当我们给类增加新功能的时候,就需要修改工厂类。在产品类型较多的情况下工厂逻辑会变复杂,不利于维护。

二.工厂方法模式

工厂方法模式是简单工厂模式的一种变形形式,它对简单工厂模式进行了更细粒度的划分,通过定义工厂接口和工厂实现类的方式,让每个工厂只生产一种产品,从而更好地满足开闭原则。工厂方法模式同样有三个角色:抽象工厂类、抽象产品类和具体产品类。在工厂方法模式中,每个具体产品类都对应一个具体的工厂类,客户端需要知道的是具体的工厂实现类,通过它来创建所需要的对象实例。
在这里插入图片描述

抽象工厂

public interface FactoryI18n {
        I18n create();
}
public class FactoryItalian implements FactoryI18n{

    @Override
    public Italian create() {
        return new Italian();
    }
}
public class FactoryChinese implements FactoryI18n {
    @Override
    public Chinese create() {
        return new Chinese();
    }
}

抽象产品

abstract class I18n {
    public I18n(){}
}

public class Italian extends I18n{
    public Italian() {
        System.out.println("Sistema della direzione del personale");
    }
}

public class Chinese extends I18n{
    public Chinese(){
        System.out.println("人事管理系统");
    }
}

客户端

public class Software{
    public static void main(String[] args) {
        FactoryChinese factoryChinese = new FactoryChinese();
         Chinese chinese = factoryChinese.create();

        FactoryItalian factoryItalian = new FactoryItalian();
        Italian software = factoryItalian.create();
    }
}

三.抽象工厂模式

抽象工厂模式是对工厂方法模式的一种扩展,它也是针对多个产品族的情况下设计的,它不仅需要提供产品的创建方法,还需要提供创建产品族的方法。在抽象工厂模式中,抽象工厂类定义了创建产品组的方法,而具体工厂类则负责生产产品组,每个产品组中包含多个产品,即每个工厂将生产多个产品,而每个产品又分别由不同的具体工厂进行实现。
在这里插入图片描述

在这里插入图片描述

//发动机型号
public interface Engine {
}
public class EngineA implements Engine {
    public EngineA(){
        System.out.println("制造-->EngineA");
    }
}
public class EngineB implements Engine {
    public EngineB(){
        System.out.println("制造-->EngineB");
    }
}

//空调型号
public interface Aircondition {
}
public class AirconditionA implements Aircondition{
    public AirconditionA(){
        System.out.println("制造-->AirconditionA");
    }
}
public class AirconditionB implements Aircondition{
    public AirconditionB(){
        System.out.println("制造-->AirconditionA");
    }
}
//创建工厂接口
public interface AbstractFactory {
    //制造发动机
    public Engine createEngine();
    //制造空调
    public Aircondition createAircondition();
}

public class FactoryBMW320 implements AbstractFactory{

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

    @Override
    public Aircondition createAircondition() {
        return new AirconditionA();
    }
}

public class FactoryBMW523 implements AbstractFactory {
    @Override
    public Engine createEngine() {
        return new EngineB();
    }

    @Override
    public Aircondition createAircondition() {
        return new AirconditionB();
    }
}
public class Custormer {
    public static void main(String[] args) {
        //生产报名320系列配件
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();
        factoryBMW320.createEngine();
        factoryBMW320.createAircondition();

        //生成宝马523系列配件
        FactoryBMW523 factoryBMW523 = new FactoryBMW523();
        factoryBMW523.createEngine();
        factoryBMW523.createAircondition();
    }
}

四.工厂模式小结

  1. 工厂模式的意义
    将实例化对象的代码提取出来,放到一个类中统一管理和维护,达到和主项目的依赖关系的解耦。从而提高项目的扩展和维护性。
  2. 三种工厂模式 (简单工厂模式、工厂方法模式、抽象工厂模式)
  3. 设计模式的依赖抽象原则
  4. 创建对象实例时,不要直接 new 类, 而是把这个new 类的动作放在一个工厂的方法中,并返回。有的书上说,变量不要直接持有具体类的引用。
  5. 不要让类继承具体类,而是继承抽象类或者是实现interface(接口)
  6. 不要覆盖基类中已经实现的方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FasterRCNN入门案例水稻图像目标检测新手友好入门案例

目录 依赖环境 代码概述 引用库 读取数据指定目录 数据集划分 数据集加载Dataset类 特征增强处理 预训练模型定义 评估指标定义 实例化训练集和测试集 设置硬件调取一个batch 可视化 ​编辑 激活选定硬件,初始化损失函数参数 模型训练 模型测试和验…

61. UE5 RPG 实现敌人近战攻击技能和转向攻击

在前面,我们实现了敌人的AI系统,敌人可以根据自身的职业进行匹配对应的攻击方式。比如近战战士会靠近目标后进行攻击然后躲避目标的攻击接着进行攻击。我们实现了敌人的AI行为,但是现在还没有实现需要释放的技能,接下来&#xff0…

让ChatGPT成为自己的旅游顾问

不积跬步,无以至千里;不积小流,无以成江海。 大家好,我是闲鹤,公众号 xxh_zone,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了7年多&a…

桃金娘T2T基因组-文献精读17

Gap-free genome assembly and comparative analysis reveal the evolution and anthocyanin accumulation mechanism of Rhodomyrtus tomentosa 无缺口基因组组装及比较分析揭示了桃金娘的进化和花青素积累机制 摘要 桃金娘(Rhodomyrtus tomentosa)是…

安装Kubernetes v3 ----以docker的方式部署

以docker的方式部署 docker run -d \ --restartunless-stopped \ --namekuboard \ -p 80:80/tcp \ -p 10081:10081/tcp \ -e KUBOARD_ENDPOINT"http://192.168.136.55:80" \ -e KUBOARD_AGENT_SERVER_TCP_PORT"10081" \ -v /root/kuboard-data:/data \ e…

Flutter中如何让Android的手势导航栏完全透明?

Flutter 开发中 安卓机器都有 像ios 的手势操作栏, 也就是屏幕底下的 那条线。 但这条线默认是有颜色的 (像下面这样) 一、全屏幕方式 void main() {// 全屏沉浸式SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []…

iOS ------ 多线程 GCD

一,GCD简介 GCD是Apple开发的一个多线程的较新的解决方案。它主要用于优化应用程序以支持多核处理器以及其他对称处理系统。它是一个在线程池模式的基础上执行的并发任务。 为什么要使用GCD? GCD!可用于多核的并行运算GCD会自动利用更多的…

【学习Day3】计算机基础

✍🏻记录学习过程中的输出,坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞👍🏻收藏⭐评论✍🏻指点🙏 1.5.4 Cache替换算法 Cache的页面淘汰算法 常用替换算法有: • 随机替换算法RA…

方差分析的七种类型

方差分析(ANOVA)是一种用于检验两个以上样本均数差别的显著性统计方法。根据不同的研究设计和数据类型,方差分析可以分为以下7种类型。 一、单因素方差分析 ①单因素方差分析说明 单因素方差分析用于研究一个定类数据(自变量&am…

开发一个SDK(starter)

1.创建项目 将pom.xml中build删除掉

用容器构建wordpress项目

用容器构建wordpress项目 #准备两个镜像 #数据库和centos docker pull mysql:5.7 docker pull centos:7 #创建一个wordpress文件夹,在wordpress文件里面写一个Dockerfile文件 vim DockerfileFROM centos:7 #基于centos环境RUN yum -y install epel-release ;\ #安装…

http协议及httpd安装组成

文章目录 一、http协议http协议通信过程http相关技术网站访问量HTTP工作机制HTTP协议版本HTTP请求访问的完整过程HTTP报文头部响应报文 二、httpd安装组成apache介绍和特点工作模式( MPM multi-processing module )Http相关文件Http编译安装httpd常见配置…

文件系统小册(FusePosixK8s csi)【1 Fuse】

文件系统小册(Fuse&Posix&K8s csi)【1 Fuse:用户空间的文件系统】 Fuse(filesystem in userspace),是一个用户空间的文件系统。通过fuse内核模块的支持,开发者只需要根据fuse提供的接口实现具体的文件操作就可以实现一个文…

Unity中的MVC框架

基本概念 MVC全名是Model View Controller 是模型(model)-视图(view)-控制器(controller)的缩写 是一种软件设计规范,用一种业务逻辑、数据、界面显示 分离的方法组织代码 将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时&#x…

tinycudann安装

在安装完torch等 直接运行下面的指令会出现错误 pip install githttps://github.com/NVlabs/tiny-cuda-nn/#subdirectorybindings/torch大部分错误是下面的 大概看了一下都是因为虚拟环境里面的include文件下缺少文件,将之前的一些.h文件全部复制过来在执行上面的…

TransmittableThreadLocal原理

1、原理 TransmittableThreadLocal(简称TTL)是阿里巴巴开源的一个Java库,用于解决线程池中线程本地变量传递的问题。其底层原理主要是基于Java的ThreadLocal机制并对其进行扩展,以支持在父子线程间以及线程池中任务切换时&#x…

Java实现顺序表

Java顺序表 前言一、线性表介绍常见线性表总结图解 二、顺序表概念顺序表的分类顺序表的实现throw具体代码 三、顺序表会出现的问题 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这个网站里内容讲解通俗易懂且风趣幽默,对我帮助很大。我想与…

Adobe AntiCC 简化版 安装教程

Adobe AntiCC 简化版 安装教程 原文地址:https://blog.csdn.net/weixin_48311847/article/details/139277743

TensorFlow Playground神经网络演示工具使用方法详解

在现代机器学习领域,神经网络无疑是一个重要的研究方向。然而,对于许多初学者来说,神经网络的概念和实际操作可能显得相当复杂。幸运的是,TensorFlow Playground 提供了一个交互式的在线工具,使得我们可以直观地理解和实验神经网络的基本原理。在这篇博客中,我们将详细介…

解读vue3源码-2

提示:看到我 请让滚去学习 vue3编译模版的提升 文章目录 vue3编译模版的提升静态节点提升补丁标志和block的使用附录: template explorer可以将我们的源模版转化成渲染函数代码,vue2中就有,而Vue3 template explorer 功能更加丰富…