【简单工厂模式-2】简单工厂模式的代码实现及使用场景

news2024/11/15 7:52:40

 简单工厂模式并属于Gof 23个经典设计模式其中之一,只是通常会将它作为学习其他工厂设计模式的入门,而且在开发中,简单工厂模式也是比较常见的,设计思想比较简单。

1. 定义

简单工厂模式定义一个工厂类,提供获取对象的方法,根据入参的不同返回不同类的实例,通常被创建的实例对象都具有共同的父类,属于创建型模式

 在简单工厂模式中,包含3个角色,如下:

  • 抽象产品角色:它作为要生产所有产品的抽象父类,封装了各种产品对象的共有方法,抽象产品角色的引入可以提高系统的灵活性,使得工厂类可以定义统一的返回值类型。
  • 具体产品角色:它是简单工厂的创建产品,所有被工厂创建的对象都是抽象产品的子类实例。
  • 工厂角色:工厂类是简单工厂模式的核心,负责实现创建产品的逻辑,它提供产品创建的方法,返回类型是抽象产品,可以被外部new,也可以通过工具类的形式调用。

2. 代码实现

 简单工厂模式代码实现比较简单,我们举个例子,某个需求要求根据客户要求生产不同类型的笔,有铅笔,钢笔,毛笔。代码如下:

  • 抽象的产品角色
// 1.抽象的产品角色
public abstract class Pen {
    // 共有的业务方法:书写
    protected abstract void write();
}
  • 具体的产品角色
// 2.具体的产品角色-铅笔
class Pencil extends Pen {
    @Override
    protected void write() {
        System.out.println("写铅笔字!");
    }
}
// 2.具体的产品角色-钢笔
class FountainPen extends Pen {
    @Override
    protected void write() {
        System.out.println("写钢笔字!");
    }
}
// 2.具体的产品角色-毛笔
class BrushPen extends Pen {
    @Override
    protected void write() {
        System.out.println("写毛笔字!");
    }
}
  • 工厂角色
// 3.工厂角色
class PenFactory {
    // 生成具体产品角色的方法
    public static Pen createPen(String type) {
        switch (type) {
            case "pencil" :
                return new Pencil();
            case "fountainPen" :
                return new FountainPen();
            case "brushPen" :
                return new BrushPen();
            default:
                return null;
        }
    }
}
  • 客户端
class Client {
    public static void main(String[] args) {
        Pen pencil = PenFactory.createPen("pencil");
        pencil.write();
        Pen fountainPen = PenFactory.createPen("fountainPen");
        fountainPen.write();
    }
}

3.UML类图

 简单工厂模式的类图也比较简单,如下图:
在这里插入图片描述


4. 简单工厂模式的简化

 有时候为了简化简单工厂模式,可以将抽象产品角色和工厂类结合,将生产具体产品的静态方法放在抽象产品角色中实现,代码如下:

// 1.抽象的产品角色
public abstract class Pen {
    // 共有的业务方法:书写
    protected abstract void write();
	// 生成具体产品的方法
    public static Pen createPen(String type) {
        switch (type) {
            case "pencil" :
                return new Pencil();
            case "fountainPen" :
                return new FountainPen();
            case "brushPen" :
                return new BrushPen();
            default:
                return null;
        }
    }
}
// 2.具体的产品角色-铅笔
class Pencil extends Pen {
    @Override
    protected void write() {
        System.out.println("写铅笔字!");
    }
}
// 2.具体的产品角色-钢笔
class FountainPen extends Pen {
    @Override
    protected void write() {
        System.out.println("写钢笔字!");
    }
}
// 2.具体的产品角色-毛笔
class BrushPen extends Pen {
    @Override
    protected void write() {
        System.out.println("写毛笔字!");
    }
}
// 3.客户端
class Client {
    public static void main(String[] args) {
        Pen pencil = Pen.createPen("pencil");
        pencil.write();
        Pen fountainPen = Pen.createPen("fountainPen");
        fountainPen.write();
    }
}

5. 简单工厂模式总结

5.1 优点

  • 如所有工厂模式一样,简单工模式实现了对象的创建和使用过程分离,进一步解耦;
  • 客户端无需知道对象的创建过程,只需知道所需产品的对应的类型参数即可;
  • 通过一些配置文件及反射机制,可以更换生产的具体产品对象,提高系统的灵活性

5.2 缺点

  • 工厂类集中了所有了产品对象的创建逻辑,职责过重,如果产品类型较多,代码可读性降低;
  • 简单工厂类的引入增加了类的个数,变相的增加了系统的复杂度和理解难度;
  • 增加新的具体产品角色时,需要修改工厂类的代码,违反了开闭原则,不利于系统扩展;
  • 简单工厂模式所有具体产品角色都与工厂类耦合,无法对工厂类进行高层抽象,不利于扩展和维护。

5.3 适用场景

  • 工厂类创建的对象比较少且比较明确,未来不会扩展新的产品角色类型;
  • 客户端只关系创建对象的入参类型,不关心对象的创建过程;

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

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

相关文章

Makefile、.mk、.bp、Blueprint、Soong、kati工具链的关系

一、Android版本相应的发展演变过程: Android 7.0引入ninja和kati Android 8.0使用Android.bp来替换Android.mk,引入Soong Android 9.0强制使用Android.bp 二、生成.ninja工具链关系:Android.bp、Blueprint、Soong、kati:总之都是用来把Make…

数据库拆分4--使用sharding-jdbc来实现水平拆分

有三张表 user log order表,先将user log 和order垂直分库,然后将user表水平拆分 配置文件 spring.shardingsphere.enabledtruespring.shardingsphere.datasource.nameswim-user,wim-orderspring.shardingsphere.datasource.wim-user.typecom.alibaba.…

vue入门--2

1.计算属性和侦听器 计算属性 VS 方法 如果不使用计算属性,在 methods 里定义了一个方法,也可以实现相同的效果,甚至该方法还可以接受参数,使用起来 更灵活。 既然 methods 同样可以解决模板中复杂逻辑计算的问题,那么…

2266. 统计打字方案数-动态规划

2266. 统计打字方案数-动态规划 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母,Alice 需要 按 对应字母 i 次,i 是该字母在这个按键上所处的位置。 比方说,为了按出字母 s ,Alice 需要按 7 …

语雀导出markdown的图片外链问题

本文节选自本人博客:https://www.blog.zeeland.cn/archives/rgoioiabeoi32 Introduction 本人因为经常使用语雀写博客,但是因为语雀转markdown的时候图片存在防外链行为,如果想要把转出的markdown发表在其他平台,就需要把md中所有…

计算机毕设Python+Vue邢台市公寓式月亮酒店管理系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

jsp+ssm计算机毕业设计大学生心理咨询网站【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

java计算机毕业设计springboot+vue地铁站自动售票系统-火车票售票系统

项目介绍 本系统是针对目前地铁站自动售票的实际需求,从实际工作出发,对过去的地铁站自动售票管理系统存在的问题进行分析,完善用户的使用体会。采用计算机系统来管理信息,取代人工管理模式,查询便利,信息准确率高,节省了开支,提高了工作的效率。 本系统结合计算机系统的结构…

Nacos系列——配置的创建与获取

Nacos系列——配置的创建与获取配置的创建与获取本文资源官方文档创建配置获取Nacos配置程序目录1.引入依赖完整pom2.设置yaml3.配置读取类NacosBasedProperties4.构建日志打印工具LoggerUtil5.构建Nacos基础服务类实现6.构建自动化任务实现结果配置的创建与获取 本文资源 ht…

非零基础自学Golang 第11章 文件操作 11.3 处理JSON文件 11.3.1 编码JSON

非零基础自学Golang 文章目录非零基础自学Golang第11章 文件操作11.3 处理JSON文件11.3.1 编码JSON第11章 文件操作 11.3 处理JSON文件 JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式。 JSON最初是属于JavaScri…

C++基础学习笔记(二)——基础入门PART2

一、数组 一个集合中,里面存放了相同类型的数据元素 特点1:数组中的每个数据元素都是相同的数据类型 特点2:数组是由连续的内存位置组成的 1.1 一维数组 一维数组定义的三种方式: 数据类型 数组名[ 数组长度 ];数据类型 数组…

高通平台开发系列讲解(充电篇)充电底层驱动 power_supply 子系统

文章目录 一、Power Supply组成二、power_supply结构体说明三、驱动接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 电池驱动采取的是 linux 内核驱动中的power_supply子系统框架进行上报电池状态。 一、Power Supply组成 power supply framework在kernel/driver…

微服务真的是万能解药吗?

程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容,包括开源项目、资源工具、技术文章等方面。 每周五定期发布,同步更新到 知乎:Jackpop。 欢迎大家投稿,提交issu…

Spring MVC学习 | 拦截器异常处理器

文章目录一、拦截器1.1 简介1.2 拦截器的使用1.2.1 创建1.2.2 配置1.2.3 测试1.3 多个拦截器的执行顺序1.3.1 preHandle()方法返回true1.3.2 preHandle()方法返回false二、异常处理器2.1 简介2.2 配置2.2.1 springmvc.xml中配置2.2.2 注解配置学习视频🎥&#xff1a…

编码与解码总结

标准ASC||字符集: ASC||:美国信息交换标准代码,包括了英文、数字等标准ASC||使用一个字节存储一个字符,首位是0,总供可以表示128个字符 GBK(汉字内码扩展规范,国标) 汉字编码字符集…

Apache Shiro,这一篇就够了

Apache Shiro,这一篇就够了1.Shiro实现登录拦截2.登录认证操作3.Shiro整合Mybatis4.用户授权操作5.Shiro授权6.Shiro整合Thymeleaf1.Shiro实现登录拦截 前期环境准备 准备添加Shiro的内置过滤器: Bean public ShiroFilterFactoryBean shiroFilterFact…

《美国职业橄榄球大联盟》:NFL·橄榄1号位

基本装备 NFL橄榄球是一项过程极为激烈的比赛,阻挡、拦截与冲撞都是比赛不可或缺的一部分,这也可以说是橄榄球的一大特色。为了保护球员的安全,避免因为球员受伤而耽误球赛, NFL与NCAA都要求所有球员必须“穿戴合适且合法的护具”…

IfcOpenShell正确设置几何体的坐标

在之前的文章中,我们使用 IfcOpenShell (IOS) 读取 ifc 几何并将其转换为 brep。 当我们读取 wikilab.ifc文件时,一切似乎都是正确的,但真的如此吗? 当你在项目中使用 BIM 时,坐标始终是正确讨论的主题。 就此而言&am…

Android开发如何使用Docker为Jenkins持续集成助力

Android开发如何使用Docker为持续集成助力 为什么使用Docker 我为啥要使用到Docker呢?其实也是被动的,因为公司的项目托管在Coding上面,然后Jenkins集成也用的是Coding的,Coding默认提供了Android-29,JDK-8的构建环境…

【JAVA进阶】多态,内部类

📃个人主页:个人主页 🔥系列专栏:JAVASE基础 目录 一、多态 1.多态的概述 2.多态的优势 3.类型转换问题 二、内部类 1.内部类概述[了解] 2.静态内部类[了解] 3.成员内部类[了解] 4.匿名内部类概述[重点] 一、多态 1.多态…