详述java的设计模式(二)

news2024/11/26 18:32:36

 

1.工厂模式

简单工厂模式(Simple Factory Pattern)属于创建型模式,是指由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的对象,而被创建的对象通常都具有共同的父类或接口,这种模式又叫做静态工厂方法模式。

简单工厂模式包含三个角色:

  1. 工厂类(Factory):负责创建所有产品的静态工厂方法,根据传入的参数创建不同的产品;
  2. 抽象产品类(Product):定义所有产品的公共接口;
  3. 具体产品类(Concrete Product):实现抽象产品类的接口,是被工厂创建的对象。

以下是一个简单的以汽车工厂为主题的示例代码,演示了如何使用工厂模式创建汽车对象。

定义一个汽车工厂接口,它包含一个用于创建汽车对象的方法

public interface CarFactory {
    Car createCar();
}

定义一个具体的汽车工厂,它实现了CarFactory接口。这个工厂根据不同的汽车类型来创建不同的汽车对象:

public class SimpleCarFactory implements CarFactory {
    @Override
    public Car createCar() {
        return new SimpleCar();
    }

    public Car createSUV() {
        return new SUVCar();
    }
}

上面代码中,定义了两个方法,createCar方法用于创建普通轿车对象,createSUV方法用于创建SUV类型的汽车对象。SimpleCarSUVCar是两个具体的汽车类。

最后,定义一个汽车接口和两个具体的汽车类,它们实现了汽车接口:

public interface Car {
    void drive();
}

public class SimpleCar implements Car {
    @Override
    public void drive() {
        System.out.println("Driving a simple car");
    }
}

public class SUVCar implements Car {
    @Override
    public void drive() {
        System.out.println("Driving an SUV car");
    }
}

这样,就可以使用工厂模式创建汽车对象了。下面是一个示例代码,演示如何使用工厂模式创建汽车对象:

public static void main(String[] args) {
    CarFactory factory = new SimpleCarFactory();
    Car car1 = factory.createCar();
    Car car2 = factory.createSUV();
    car1.drive();
    car2.drive();
}

工厂模式的应用场景主要是在对象的创建过程中,对类的实例化进行隔离。在使用工厂模式的时候,客户端不需要知道具体的类的类型,只需要知道具体类型对应的参数即可得到所需的对象。因此,工厂模式可以在不暴露具体类的内部实现的情况下,通过规定好的接口来创建对象。工厂模式在软件开发中广泛应用。

应用场景:

  1. 系统的初始化需要创建大量的对象;
  2. 系统中的对象种类较多,用工厂方法将客户端和具体类解耦;
  3. 创建对象需要进行大量的重复性工作,如数据库查询,通过工厂模式统一管理;
  4. 需要动态地配置创建对象的种类。

2.抽象工厂模式

interface Shape {
    void draw();
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Rectangle");
    }
}

class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing Circle");
    }
}

interface Color {
    void fill();
}

class Red implements Color {
    @Override
    public void fill() {
        System.out.println("Filling Red");
    }
}

class Green implements Color {
    @Override
    public void fill() {
        System.out.println("Filling Green");
    }
}

abstract class AbstractFactory {
    abstract Shape getShape(String shapeType);
    abstract Color getColor(String colorType);
}

class ShapeFactory extends AbstractFactory {
    @Override
    Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
    @Override
    Color getColor(String colorType) {
        return null;
    }
}

class ColorFactory extends AbstractFactory {
    @Override
    Shape getShape(String shapeType) {
        return null;
    }
    @Override
    Color getColor(String colorType) {
        if (colorType == null) {
            return null;
        }
        if (colorType.equalsIgnoreCase("RED")) {
            return new Red();
        } else if (colorType.equalsIgnoreCase("GREEN")) {
            return new Green();
        }
        return null;
    }
}

class FactoryProducer {
    static AbstractFactory getFactory(String choice) {
        if (choice.equalsIgnoreCase("SHAPE")) {
            return new ShapeFactory();
        } else if (choice.equalsIgnoreCase("COLOR")) {
            return new ColorFactory();
        }
        return null;
    }
}

public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        AbstractFactory shapeFactory = FactoryProducer.getFactory("SHAPE");
        Shape shape1 = shapeFactory.getShape("CIRCLE");
        shape1.draw();
        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        shape2.draw();
        AbstractFactory colorFactory = FactoryProducer.getFactory("COLOR");
        Color color1 = colorFactory.getColor("RED");
        color1.fill();
        Color color2 = colorFactory.getColor("GREEN");
        color2.fill();
    }
}

应用场景

抽象工厂模式的应用场景主要有以下几点:

  1. 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
  2. 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
  3. 隔离多个产品族,让客户端不需要关心创建细节。
  4. 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。
  5. 提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。

因此,抽象工厂模式适用于以下场景:

  1. 创建多个产品族,产品等级高于单个产品。
  2. 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是重要的。
  3. 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  4. 属于同一个产品族的产品将在一起使用,这一约束必须在系

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

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

相关文章

数据结构和算法学习

文章目录精通一个领域切题四件套算法算法的五个条件流程图数据结构数据与信息数据信息数据结构和算法数据结构算法时间复杂度空间复杂度数组 Array优点缺点数组和链表的区别时间复杂度链表 Linked List优点缺点时间复杂度单向链表双向链表循环链表双向循环链表堆栈 Stack队列 Q…

涂鸦开发资源中心硬核上线!支持产物包可视化、自由裁剪开发框架等功能

开发过程对于程序猿们来说,就像建碉堡,碉堡的建成速度、创造力,以及精致和牢固程度,取决于工具称不称手。不称手的开发工具,不仅能让人心力交瘁,还会多掉几根头发。 为了帮助开发者获得更好的开发体验&…

【搞透C语言指针】那年我双手插兜, 不知道指针是我的对手

☃️内容专栏:【C语言】进阶部分 ☃️本文概括: 征服C语言指针!一篇文章搞清楚指针的全部要点。 ☃️本文作者:花香碟自来_ ☃️发布时间:2023.3.3 目录 一、字符指针 二、指针数组 三、数组指针 1.数组指针的定义…

UML常见图的总结

一、概述 UML:Unified Modeling Language,统一建模语言,支持从需求分析开始的软件开发的全过程。是一个支持模型化和软件系统开发的图形化语言、为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到…

ESP32设备驱动-SHT11温度湿度传感器驱动

SHT11温度湿度传感器驱动 SHT1x 数字湿度传感器是一种可回流焊接的传感器。 SHT1x 系列包括带有 SHT10 湿度传感器的低成本版本、带有 SHT11 湿度传感器的标准版本和带有 SHT15 湿度传感器的高端版本。 与 SHTxx 湿度传感器系列中的所有其他 Sensirion 传感器类型一样,它们经…

H2数据库连接时用户密码错误:Wrong user name or password [28000-214] 28000/28000 (Help)

H2数据库连接时用户密码错误: 2023-03-03 08:25:07 database: wrong user or password; user: "SA" org.h2.message.DbException: Wrong user name or password [28000-214]出现的问题配置信息原因解决办法org.h2.message.DbException: Wrong user name or password …

Python从入门到转行,看完这一篇就够了

Python零基础入门 零基础入门就得从最基本的变量,语法格式,数据类型,函数,作用域,模块等基本知识入手(有编程基础基础也得这么来) 和篮球一样,先来三步上篮: Python基…

Spring Boot 分片上传、断点续传、大文件上传、秒传

文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,…

MySQL面试题-基础篇

目录 前言 数据库基础 1.什么是关系型数据库和非关系型数据库? 2.什么是 SQL? 3.MySQL 有什么优点? 4.MySQL 的基础架构? 存储引擎 1.MySQL 支持哪些存储引擎?默认使用哪个? 2.MySQL 存储引擎架构了解吗&…

C# IoC控制反转学习笔记

一、什么是IOC IoC-Invertion of Control,即控制反转,是一种程序设计思想。 先初步了解几个概念: 依赖(Dependency):就是有联系,表示一个类依赖于另一个类。 依赖倒置原则(DIP&a…

苹果ipa软件下载网站和软件的汇总

随着时间的流逝,做苹果版软件安装包下载网站和软件的渐渐多了起来。 当然,已经关站、停运、下架、倒闭的苹果软件下载网站和软件我就不说了,也不必多说那些关站停运下架倒闭的网站和软件了。 下面我统计介绍的就是苹果软件安装包下载网站和软…

系列十二、MySQL管理

一、系统数据库 Mysql数据库安装完成后,自带了一下四个数据库,具体作用如下:二、常用工具 2.1、mysql 2.1.1、概述 该mysql不是指mysql服务,而是指mysql的客户端工具。 2.1.2、语法 # 语法 : mysql [options] [dat…

分库分表、分库分表带来的问题

文章目录1.分库垂直分库水平分库2.分表垂直分表水平分表3.水平分表的路由方式(1)范围路由(2)Hash 路由4.分库分表带来的问题分库(1)事务的问题注意(2)跨库 JOIN 问题分表&#xff08…

k8s-故障转移 livenessProbe readinessProbe 学习总结

k8s-故障转移学习总结 大纲 概念K8S中Pod健康检查livenessProbe & readinessProbelivenessProbe 存活探测实例readinessProbe 就绪探测实例 概念 故障转移有哪些情况 物理机故障程序故障 在计算机术语中,故障转移(英语:failover&am…

深入底层源码的Listener内存马(内存马系列篇三)

写在前面 继前面的FilterServlet内存马技术,这是系列文章的第三篇了,这篇将给大家带来的是Listener内存马技术。 前置 什么是Listener? 监听器 Listener 是一个实现特定接口的 Java 程序,这个程序专门用于监听另一个 Java 对象…

Pag的2D渲染执行流程

Pag的渲染 背景 根据Pag文章里面说的,Pag之前长时间使用的Skia库作为底层渲染引擎。但由于Skia库体积过大,为了保证通用型(比如兼容CPU渲染)做了很多额外的事情。所以Pag的工程师们自己实现了一套2D图形框架替换掉Skia&#xff…

GC Garbage Collectors

本质一、算法1、哪些是垃圾?引用计数法:reference countPython中使用了。个对象如果没有任何与之关联的引用,即他们的引用计数都不为 0,则说明对象不太可能再被用到,那么这个对象就是可回收对象。漏洞:循环…

C/C++每日一练(20230303)

目录 1. 字符串相乘 2. 单词拆分 II 3. 串联所有单词的子串 1. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。 示例 1: 输入: num1 "2", num2 "3"…

【Linux】PXE+Kickstart无人值守安装系统

文章目录前言一、简介二、配置DHCP三、TFTP四、SYSLinux服务程序五、vsftpd服务六、Kickstart应答文件七、自动安装系统八、总结前言 本文来记录下PXEKickstart无人值守安装系统。 当需要安装OS的主机数量较多时,我们不可能通过U盘或光盘给这一台台主机去安装操作系…

SpringCloud项目报错和解决方法记录

1、项目在IDEA中正常启动,打包后报错 背景 项目本地是没有 application.yml 配置文件的,而是把配置文件放在nacos上,本地只有一个 bootstrap.yml 来绑定nacos上的配置文件。 项目在IDEA上是可以正常启动运行的,然后我就准备打包…