设计模式 (二) 工厂模式 Java

news2024/9/21 12:21:15

目录

一、案例引出

二、简单工厂模式

二、抽象工厂


工厂设计模式,顾名思义类似一家工厂来制造各种产品,目的在于提高代码的可扩展性。

一、案例引出

通过接口来实现一类产品的功能,如目前有飞机、轮船、汽车这类产品的实体类,同时需要具备移动的属性,此时我们优先想到的是通过接口来实现,例如:

插件Moveable接口来让各个需要该属性的对象实现,但这样做在业务结构简单是没问题,当业务结构复杂时,该方式的拓展性并不太好,没增加一种产品都需要去实现多个属性接口。

public interface Moveable {
    void go();
}
public class Car implements Moveable{
    @Override
    public void go() {
        System.out.println("car goes...");
    }
}
public class Plane implements Moveable{
    @Override
    public void go() {
        System.out.println("plane goes...");
    }
}
public class Ship implements Moveable{
    @Override
    public void go() {
        System.out.println("ship goes...");
    }
}

下面来看看工厂模式是如何实现的

二、简单工厂模式

简单工厂模式适用于产品种类单一的业务

通过简单工厂可以有效管理种类单一的产品

public class SimpleFactory {

    public static Moveable createCar(){
        //前至处理
        return new Car();
    }

    public static Moveable createShip(){
        //前至处理
        return new Ship();
    }

    public static Moveable createPlane(){
        //前至处理
        return new Plane();
    }

}

产品创建:当产品增加时直接在工厂里进行添加,拓展性较好

    public static void main(String[] args) {
        Moveable car = SimpleFactory.createCar();
        Moveable ship = SimpleFactory.createShip();
        Moveable plane = SimpleFactory.createPlane();
        car.go();
        ship.go();
        plane.go();
    }

二、抽象工厂

对于业务复杂,种类较多的产品时简单工厂并不能有效解决种类繁多管理的问题,由此引入抽象工厂进行管理:

我们可以创建一个抽象工厂来管理各个大类的产品:

public abstract class AbstractFactory {
    abstract Vehicle createVehicle();
    abstract Food createFood();
    abstract Weapon createWeapon();
}

分别创建各个大类的抽象类:

public abstract class Food {
    abstract void eat();
}
public abstract class Vehicle {
    abstract void go();
}
public abstract class Weapon {
    abstract void fight();
}

创建多种不同的工厂来加工不同的产品:都继承自AbastractFactory。产品都继承自类别抽象类。

public class ModernFactory extends AbstractFactory{
    @Override
    Vehicle createVehicle() {
        return new Car();
    }

    @Override
    Food createFood() {
        return new Bread();
    }

    @Override
    Weapon createWeapon() {
        return new AK47();
    }
}
public class AncientFactory extends AbstractFactory {
    @Override
    Vehicle createVehicle() {
        return new Ship();
    }

    @Override
    Food createFood() {
        return new Fish();
    }

    @Override
    Weapon createWeapon() {
        return new Arrow();
    }
}

以上演示为多个不同工厂的实例。

工厂生产产品:该设计模式也可借鉴单例模式来实现静态工厂。

    public static void main(String[] args) {
        AncientFactory ancientFactory = new AncientFactory();
        Food food = ancientFactory.createFood();
        food.eat();
    }

工厂模式生产和管理产品总结到此。

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

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

相关文章

Windows 安装 Android Studio

1、下载Android Studio https://r1—sn-2x3edn7s.gvt1.com/edgedl/android/studio/install/2022.1.1.19/android-studio-2022.1.1.19-windows.exe?cms_redirectyes&mhBy&mip175.146.144.124&mm28&mnsn-2x3edn7s&msnvh&mt1673878346&mvm&mvi1…

Pycharm社区版侧边栏没有database按钮

Pycharm有专业版和社区版这两个版本,普通人在大多数情况下我们都会选择社区版进行下载安装。为啥呢?因为社区版免费,专业版收费一般人用不起呀,而且社区版能够基本满足我们的日常需求(但是这也就意味着社区版会比专业版…

LINUX学习之查看文件常用命令(四)

cat 命令描述 cat命令是一种用于查看文件内容的命令,它可以将文件的内容直接输出到标准输出 以下是cat命令常用参数: -A :显示所有字符,包括特殊字符-b :显示行号,仅针对非空白行-E :在每行…

【Java集合进阶】Collection 体系集合详解(ArrayList,LinkedList,HashSet,TreeSet...)

文章目录1. 概念2. 集合和数组的区别3. 集合的体系结构4. Collection父接口5. List 子接口6. List 实现类6.1 ArrayList 类6.2 Vector 类6.3 LinkedList 类6.4 ArrayList和LinkedList的区别7. Set 子接口8. Set 实现类8.1 HashSet 类8.2 TreeSet 类9. Collections 工具类Java编…

Vue9-数据代理

数据代理:通过一个对象代理对另一个对象中属性的操作(读写) 结论:Vue中通过vm(实例对象)来代理data中的所有数据 1.首先创建了一个vm对象 2.然后 vue就给vm准备了一些数据,当然也将data存放到…

Ubuntu下源码编译VirtualBox二 —— 源码编译(1)

先打个预防针:在Ubuntu下编译VirtualBox可以说相当复杂。 1. 编译指导 (1)进入技术文档页面 在VirtualBox主页(Oracle VM VirtualBox)中,鼠标左键点击“Documentation”下的“Technical docs”&#xff0…

【Android安全】安装mitmproxy Https抓包证书 | 安卓SSL抓包

安装mitmproxy Https抓包证书 macbook上 mitmproxy 抓取安卓手机https流量 重点是安装mitmproxy Https抓包证书 前提 手机需要root,macbook上需要安装好mitmproxy macbook安装mitmproxy 需要完成下文1-3: https://github.com/doug-leith/cydia &…

【内排序 -- 八大排序】

目录:前言算法实现(一)插入排序1.直接插入排序2.希尔排序(缩小增量排序)(二)选择排序1.选择排序2.堆排序(三)交换排序冒泡排序快速排序1(hoare版)…

ARM S5PV210的SD卡启动实战

一、S5PV210的SD卡启动实战1 1、任务:大于16KB的bin文件使用 SD 卡启动 (1) 总体思路:将我们的代码分为 2 部分:第一部分 BL1 ≤ 16KB,第二部分为任意大小。 iROM 代码执行完成后,从 SD 卡启动会自动读取 BL1 到 SRA…

多核缓存一致性问题及解决方案MESI协议《深入浅出计算机组成原理》学习笔记 Day 4

系列文章目录 这是本周期内系列打卡文章的所有文章的目录 《Go 并发数据结构和算法实践》学习笔记 Day 1《Go 并发数据结构和算法实践》学习笔记 Day 2《说透芯片》学习笔记 Day 3 文章目录系列文章目录前言一、多核缓存一致性从何而来(What)二、怎么解…

学习TinyRenderer

1图形学图形学,简单来讲是将3D数据以各个视觉效果呈现在2D画布(屏幕)上;2 TinyRendererTinyRenderer从零开始实现了一个渲染器;TinyRenderer代码地址:https://github.com/ssloy/tinyrenderer内容介绍在&…

ThreeDXF预览DXF文件集成到vue项目中

由于网上资料都是html的,而自己需要嵌入到vue项目中,查找资料都是在index.html引入script脚本,在写到Vue文件中,但是我尝试过了,各种报错,找不到,window. 根本无法用,于是改注入main…

主动服务再升级!这个品牌引领智慧生活进入“深度体验”

文|智能相对论作者| 佘凯文1月15日,一档央视新闻的新概念科技节目《KU A !酷啊未来 | 中国科技创新之夜》正式播出,来自中国科学院的多领域顶级科学家及许多科技企业、青年科研人员代表,共同分享了科技创新之路上的成果和突破。不…

EDI文件处理失败如何汇总?

知行之桥EDI系统在后台自动运行的时候,有时会遇到处理文件失败的情况,导致失败的原因有很多,部分客户希望把处理失败的文件都汇总起来,便于分析失败原因,减少未来再出现类似的错误,同时也能够方便后期排查&…

ERD Online 4.0.7 在线数据库建模、元数据管理(免费、私有部署)

4.0.7❝ feat(erd): 增加新春火红主题feat(erd): 增加团队协作人员进入、退出提示fix(erd): 修复权限配置页面显示混乱doc(erd): 修改更新通告地址❞变化一览 增加新春火红主题 新春主题所有按钮、菜单、元素由原来的蓝色改为火红色修复权限配置页面显示混乱 团队功能增加团队协…

【算法基础】快速排序

目录 一、快速排序核心思想 二、快速排序步骤 (1)暴力做法 (2)双指针做法 三、代码模板 四、边界问题 五、总结 一、快速排序核心思想 分治,即将一个序列划分成左部分小于等于x,右部分大于等于x 二、快速排序步骤 ①确定一个分界点x。分界点可以是左端 a[l]、右…

【Linux】两个故事带你使用git命令行

目录一.历史故事背景经过git的诞生二.git版本管理1.小故事2.理解版本管理三.git的使用1.仓库的创建2.安装git和仓库克隆3.上传代码三板斧addcommitpushgithub和gitee是代码的托管平台,我们上传代码或文件在其中,来管理我们的代码和不同版本软件。 在多人…

【操作系统】——主流的操作系统(带你快速了解)

📜 “作者 久绊A” 专注记录自己所整理的Java、web、sql等,IT技术干货、学习经验、面试资料、刷题记录,以及遇到的问题和解决方案,记录自己成长的点滴。 🍁 操作系统【带你快速了解】对于电脑来说,如果说…

【Java IO流】字符集使用详解

文章目录前言ASCIIGBKUnicode为什么会出现乱码前言 上一节关于字节流的文章中,在使用字节流读取本地文件中的数据时,文件中只存放了英文,而并没有存放中文数据。我们还提到了不建议使用字节流读取纯文本文件的数据,否则会出现乱码…

Elasticsearch7.8.0版本高级查询—— 匹配查询文档

目录一、初始化文档数据二、匹配查询文档示例2.1、概述2.2、示例一、初始化文档数据 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/1,请求体内容为: {"name":"张三","age&…