创建型设计模式与面向接口编程

创建型设计模式(Creational Patterns)的主要目的之一就是帮助实现面向接口编程,避免直接创建实现类的实例。通过这些模式,可以将对象的创建过程封装起来,使得客户端代码不需要知道具体的实现类,从而提高代码的灵活性和可维护性。

以下是创建型设计模式的详细说明及其如何支持面向接口编程:

1. 单例模式(Singleton Pattern)

  • 目的:确保一个类只有一个实例,并提供一个全局访问点。
  • 面向接口编程:虽然单例模式通常不涉及接口的使用,但它通过控制实例的创建,避免了客户端直接创建实例。
  • 示例
    public class Singleton {
        private static Singleton instance;
        private Singleton() {}
    
        public static Singleton getInstance() {
            if (instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }
    
    客户端代码只能通过 getInstance() 方法获取实例,无法直接实例化 Singleton 类。

2. 工厂方法模式(Factory Method Pattern)

  • 目的:定义一个创建对象的接口,但将实例化的具体类延迟到子类中实现。
  • 面向接口编程:客户端代码通过工厂接口创建对象,而不需要知道具体的实现类。
  • 示例
    interface Product {
        void doSomething();
    }
    
    class ConcreteProductA implements Product {
        @Override
        public void doSomething() {
            System.out.println("Product A");
        }
    }
    
    interface Factory {
        Product createProduct();
    }
    
    class ConcreteFactoryA implements Factory {
        @Override
        public Product createProduct() {
            return new ConcreteProductA();
        }
    }
    
    // 客户端代码
    Factory factory = new ConcreteFactoryA();
    Product product = factory.createProduct();
    product.doSomething();
    
    客户端代码只与 Factory 接口和 Product 接口交互,不直接创建 ConcreteProductA 的实例。

3. 抽象工厂模式(Abstract Factory Pattern)

  • 目的:提供一个接口,用于创建一系列相关或依赖的对象,而不指定具体的类。
  • 面向接口编程:客户端代码通过抽象工厂接口创建一组相关对象,而不需要知道具体的实现类。
  • 示例
    interface Button {
        void paint();
    }
    
    class WinButton implements Button {
        @Override
        public void paint() {
            System.out.println("Windows Button");
        }
    }
    
    interface GUIFactory {
        Button createButton();
    }
    
    class WinFactory implements GUIFactory {
        @Override
        public Button createButton() {
            return new WinButton();
        }
    }
    
    // 客户端代码
    GUIFactory factory = new WinFactory();
    Button button = factory.createButton();
    button.paint();
    
    客户端代码只与 GUIFactory 接口和 Button 接口交互,不直接创建 WinButton 的实例。

4. 建造者模式(Builder Pattern)

  • 目的:将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
  • 面向接口编程:客户端代码通过建造者接口构建对象,而不需要知道具体的实现类。
  • 示例
    class Product {
        private String partA;
        private String partB;
        // 构造函数和方法省略
    }
    
    interface Builder {
        void buildPartA();
        void buildPartB();
        Product getProduct();
    }
    
    class ConcreteBuilder implements Builder {
        private Product product = new Product();
    
        @Override
        public void buildPartA() {
            product.setPartA("Part A");
        }
    
        @Override
        public void buildPartB() {
            product.setPartB("Part B");
        }
    
        @Override
        public Product getProduct() {
            return product;
        }
    }
    
    class Director {
        private Builder builder;
    
        public Director(Builder builder) {
            this.builder = builder;
        }
    
        public Product construct() {
            builder.buildPartA();
            builder.buildPartB();
            return builder.getProduct();
        }
    }
    
    // 客户端代码
    Builder builder = new ConcreteBuilder();
    Director director = new Director(builder);
    Product product = director.construct();
    
    客户端代码只与 Builder 接口和 Director 类交互,不直接创建 Product 的实例。

5. 原型模式(Prototype Pattern)

  • 目的:通过克隆现有对象来创建新对象,而不是通过标准构造函数。
  • 面向接口编程:客户端代码通过原型接口克隆对象,而不需要知道具体的实现类。
  • 示例
    interface Prototype {
        Prototype clone();
    }
    
    class ConcretePrototype implements Prototype {
        @Override
        public Prototype clone() {
            return new ConcretePrototype();
        }
    }
    
    // 客户端代码
    Prototype prototype = new ConcretePrototype();
    Prototype clone = prototype.clone();
    
    客户端代码只与 Prototype 接口交互,不直接创建 ConcretePrototype 的实例。

总结

创建型设计模式通过封装对象的创建过程,实现了面向接口编程,避免了客户端代码直接依赖具体的实现类。这种方式提高了代码的灵活性、可维护性和可扩展性,是实现面向对象设计原则的重要手段。

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

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

相关文章

连续九届EI稳定|江苏科技大学主办

【九届EI检索稳定|江苏科技大学主办 | IEEE出版 】 🎈【截稿倒计时】!!! ✨徐秘书:gsra_huang ✨往届均已检索,已上线IEEE官网 🎊第九届清洁能源与发电技术国际学术会议(CEPGT 2…

机器学习 - 为 Jupyter Notebook 安装新的 Kernel

https://ipython.readthedocs.io/en/latest/install/kernel_install.html 当使用jupyter-notebook --no-browser 启动一个 notebook 时,默认使用了该 jupyter module 所在的 Python 环境作为 kernel,比如 C:\devel\Python\Python311。 如果&#xff0c…

DVWA靶场通关——SQL Injection篇

一,Low难度下unionget字符串select注入 1,首先手工注入判断是否存在SQL注入漏洞,输入1 这是正常回显的结果,再键入1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for…

无人机飞手执照处处需要,森林、石油管道、电力巡检等各行业都需要

无人机飞手执照在多个行业中确实具有广泛的应用需求,包括森林、石油管道、电力巡检等领域。以下是对这些领域无人机飞手执照需求的具体分析: 一、森林领域 在森林领域,无人机飞手执照对于进行高效、准确的森林资源管理和监测至关重要。无人机…

基于YOLO11/v10/v8/v5深度学习的水面垃圾智能检测识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

家政服务小程序,家政行业数字化发展下的优势

今年以来,家政市场需求持续增长,市场规模达到了万亿级别,家政服务行业成为了热门行业之一! 家政服务种类目前逐渐呈现了多样化,月嫂、保姆、做饭保洁、收纳、维修等家政种类不断出现,满足了居民日益增长的…

音视频入门基础:MPEG2-TS专题(3)——TS Header简介

注:本文有部分内容引用了维基百科:https://zh.wikipedia.org/wiki/MPEG2-TS 一、引言 本文对MPEG2-TS格式的TS Header进行简介。 进行简介之前,请各位先下载MPEG2-TS的官方文档。ITU-T和ISO/IEC都分别提供MPEG2-TS的官方文档。但是ITU提供的…

Spring Boot框架:构建符合工程认证的计算机课程

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

【ubuntu16.04】机器人学习笔记遇到的问题及解决办法:仿真小海龟

18版本的后面会出问题,避免万一我还是用了之前的16版本,虽然还没有解决粘贴的问题,但是安装ros很成功 可参考该文章博主讲的很详细,成功画出海龟 最后要把鼠标停在第三个终端,再去点击键盘,海龟才会动哦

Unity学习---IL2CPP打包时可能遇到的问题

写这篇主要是怕自己之后打包的时候出问题不知道怎么搞,所以记录一下。 问题一:类型裁剪 IL2CPP打包后会自动对Unity工程的dll进行裁剪,将代码中没有引用到的类型裁剪掉。特别是通过反射等方式调用一些类的时候,很容易出问题。 …

批量将MySQL中的MyISAM引擎,改成InnoDB引擎

一、InnoDB和MyISAM的区别 MySQL中InnoDB和MyISAM是两种常用的存储引擎,具有以下不同的特点: 序号InnoDBMyISAM说明事务支持支持不支持InnoDB可以处理更复杂的业务逻辑,而MyISAM在处理大量并发写入时可能会遇到问题‌锁定机制行级锁定表级锁…

认证鉴权框架SpringSecurity-1--概念和原理篇

1、基本概念 Spring Security 是一个强大且高度可定制的框架,用于构建安全的 Java 应用程序。它是 Spring 生态系统的一部分,提供了全面的安全解决方案,包括认证、授权、CSRF防护、会话管理等功能。 2、认证、授权和鉴权 (1&am…

C++11新特性(二)

目录 一、C11的{} 1.初始化列表 2.initializer_list 二、可变参数模版 1.语法与原理 2.包扩展 3.empalce接口 三、新的类功能 四、lambda 1.语法 2.捕捉列表 3.原理 五、句装器 1.function 2.bind 一、C11的{} 1.初始化列表 C11以后想统⼀初始化⽅式&#xff0…

Nginx配置自带的stub状态实现活动监控指标

场景 为了确保应用以最佳性能和精度运行,需要清晰地了解有关其活动的监控指标。 NGINX 提供了多种监控选项,例如 stub 状态。 注: 博客:霸道流氓气质-CSDN博客 实现 启用 NGINX stub 状态 启用 NGINX HTTP 服务器内 locati…

RabbitMQ-死信队列(golang)

1、概念 死信(Dead Letter),字面上可以理解为未被消费者成功消费的信息,正常来说,生产者将消息放入到队列中,消费者从队列获取消息,并进行处理,但是由于某种原因,队列中的…

Redisson的可重入锁

初始状态: 表示系统或资源在没有线程持有锁的情况下的状态,任何线程都可以尝试获取锁。 线程 1 获得锁: 线程 1 首次获取了锁并进入受保护的代码区域。 线程 1 再次请求锁: 在持有锁的情况下,线程 1 再次请求锁&a…

java程序打包及执行 jar命令及运行jar文件

java程序打包及执行 jar命令及运行jar文件 打包命令: 安装完成jdk之后采用 jar命令进行打包 jar -cvfe ddd.jar -C bin/ddd.java 打包 ddd.java 文件 jar -cvfe dddd.jar -C . 注意 -C 后面的点. 表示当前目录下所有 如图: 运行jar 文件 java -class…

视频孪生技术在金融银行网点场景中的应用价值

作为国民经济重要的基础行业,金融行业在高速发展的同时衍生出业务纠纷、安全防范、职能管理等诸多问题,对安全防范和监督管理提出了更高的要求。因此,如何能更好的利用视频监控系统价值,让管理人员更简便的浏览监控视频、更快速的…

SpringCloud OpenFeign负载均衡远程调用 跨服务调用 连接池优化

介绍 Spring Cloud OpenFeign 是 Spring Cloud 的一部分,提供了一种声明式的 HTTP 客户端方式来简化服务间的通信。通过 OpenFeign,开发者可以像调用本地方法一样,轻松地调用远程服务,而不需要手动处理 HTTP 请求、响应和连接等底…

Go语言实现用户登录Web应用

文章目录 1. Go语言Web框架1.1 框架比较1.2 安装Gin框架 2. 实现用户登录功能2.1 创建项目目录2.2 打开项目目录2.3 创建登录Go程序2.4 创建模板页面2.4.1 登录页面2.4.2 登录成功页面2.4.3 登录失败页面 3. 测试用户登录项目3.1 运行登录主程序3.2 访问登录页面3.3 演示登录成…