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

创建型设计模式(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 {@Overridepublic void doSomething() {System.out.println("Product A");}
    }interface Factory {Product createProduct();
    }class ConcreteFactoryA implements Factory {@Overridepublic 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 {@Overridepublic void paint() {System.out.println("Windows Button");}
    }interface GUIFactory {Button createButton();
    }class WinFactory implements GUIFactory {@Overridepublic 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();@Overridepublic void buildPartA() {product.setPartA("Part A");}@Overridepublic void buildPartB() {product.setPartB("Part B");}@Overridepublic 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 {@Overridepublic Prototype clone() {return new ConcretePrototype();}
    }// 客户端代码
    Prototype prototype = new ConcretePrototype();
    Prototype clone = prototype.clone();
    
    客户端代码只与 Prototype 接口交互,不直接创建 ConcretePrototype 的实例。

总结

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段

前言 因为我司「七月在线」关于dexcap的复现/优化接近尾声了(每月逐步提高复现的效果),故准备把dexcap的源码也分析下,11月​下旬则分析下iDP3的源码——为队伍「iDP3人形的复现/优化」助力 最开始,dexcap的源码分析属于此文《DexCap——斯…

Python中的HTML

文章目录 一. HTML1. html的定义2. html的作用3. 基本结构4. 常用的html标签5. 列表标签① 无序列表② 有序列表 6. 表格标签7. 表单标签8. 表单提交① 表单属性设置② 表单元素属性设置 一. HTML 1. html的定义 HTML 的全称为:HyperText Mark-up Language, 指的是…

PdServer:调用MidjourneyAPI完成静夜思图文生成

欢迎沟通讨论,WX: cdszsz。公号:AIGC中文站。 今天我们将使用PdServer,通过Qwen大模型完成古诗的解析与prompt的生成,然后调用MidjourneyAPI完成图片的生成。有了文案和图片,我们就可以将其生成为一个古诗讲读视频。从…

论文 | The Capacity for Moral Self-Correction in LargeLanguage Models

概述 论文探讨了大规模语言模型是否具备“道德自我校正”的能力,即在收到相应指令时避免产生有害或偏见输出的能力。研究发现,当模型参数达到一定规模(至少22B参数)并经过人类反馈强化学习(RLHF)训练后&…

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

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

删库跑路,启动!

起因:这是一个悲伤的故事,在抓logcat时 device待机自动回根目录了,而题主对当前路径的印象还停留在文件夹下,不小心在根目录执行了rm -rf * … 所以,这是个悲伤的故事,东西全没了…device也黑屏了&#xff…

unity单例模式的不同声明(待完善

总结: 这段代码实现了一个泛型单例模式(Singleton Pattern),用于确保某个类(由泛型参数 T 指定)在整个应用程序中只有一个实例,并且在第一次访问时才创建该实例。该模式保证了该实例的全局唯一…

低代码牵手 AI 接口:开启智能化开发新征程

一、低代码与 AI 接口的结合趋势 低代码开发平台近年来在软件开发领域迅速崛起。随着企业数字化转型的需求不断增长,低代码开发平台以其快速构建应用程序的优势,满足了企业对高效开发的需求。例如,启效云低代码平台通过范式化和高颗粒度的可配…

3. Sharding-Jdbc核⼼流 程+多种分⽚策略

1. Sharding-Jdbc 分库分表执⾏核⼼流程 Sharding-JDBC执行流程 1. SQL解析 -> SQL优化 -> SQL路由 -> SQL改写 -> SQL执⾏-> 结果归并 ->返回结果简写为:解析->路由->改写->执⾏->结果归并1.1 SQL解析 1. SQL解析过程分为词法解析…

解读Nature:Larger and more instructable language models become less reliable

目录 Larger and more instructable language models become less reliable 核心描述 核心原理 创新点 举例说明 大模型训练,微调建议 Larger and more instructable language models become less reliable 这篇论文的核心在于对大型语言模型(LLMs)的可靠性进行了深入…

A3超级计算机虚拟机,为大型语言模型LLM和AIGC提供强大算力支持

热门大语言模型项目地址:www.suanjiayun.com/mirrorDetails?id66ac7d478099315577961758 近几个月来,我们目睹了大型语言模型(LLMs)和生成式人工智能强势闯入我们的视野,显然,这些模型在训练和运行时需要…

跟着尚硅谷学vue2—基础篇4.0

11. 收集表单数据 收集表单数据&#xff1a; 若&#xff1a;<input type"text"/>&#xff0c;则v-model收集的是value值&#xff0c;用户输入的就是value值。 若&#xff1a;<input type"radio"/>&#xff0c;则v-model收集的是value值&…

「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024

你是否想过&#xff0c;未来你看到的电影预告片、广告&#xff0c;甚至新闻报道&#xff0c;都可能完全由 AI 生成&#xff1f; 在人工智能迅猛发展的今天&#xff0c;视频技术正经历着一场前所未有的变革。从智能编解码到虚拟数字人&#xff0c;再到 AI 驱动的视频生成&#…

【LeetCode】每日一题 2024_11_14 统计好节点的数目(图/树的 DFS)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;统计好节点的数目 代码与解题思路 先读题&#xff1a;题目要求我们找出好节点的数量&#xff0c;什么是好节点&#xff1f;“好节点的所有子节点的数量都是相同的”&#xff0c;拿示例一…

js中typeOf无法区分数组对象

[TOC]&#xff08;js中typeOf无法区分数组对象) 前提&#xff1a;很多时候我们在JS中用typeOf来判断值类型&#xff0c;如&#xff1a;typeOf ‘abc’//string ,typeOf 123 //number; 但当判断对象为数组时返回的仍是’object’ 这时候我们可以使用Object.prototype.toString.c…

ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案

在当今快速发展的农业领域&#xff0c;智慧农业已成为推动农业现代化、助力乡村全面振兴的新手段和新动能。随着信息技术的持续进步和城市化进程的加快&#xff0c;智慧农业对于监控安全和智能管理的需求日益增长。 视频设备轨迹回放平台EasyCVR作为智慧农业视频远程监控管理方…

android studio 更改gradle版本方法(备忘)

如果出现类似以下&#xff1a; Your build is currently configured to use Java 17.0.11 and Gradle 6.1.1. 或者类似&#xff1a; Failed to calculate the value of task ‘:app:compileDebugJavaWithJavac‘ property ‘options.generatedSo 消息时需要修改gradle版本&…

使用 Vision 插件让 GitHub Copilot 识图问答

GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码&#xff0c;还可以回答各种技术相关的问题。GitHub Copilot 在刚刚召开的全球技术大会上宣布升级了 GitHub Copilot 背后的大语言模型&#xff0c;现在已经正式启用 GPT 4…

LeetCode面试经典150题C++实现,更新中

用C实现下面网址的题目 https://leetcode.cn/problems/merge-sorted-array/?envTypestudy-plan-v2&envIdtop-interview-150 1、数组\字符串 88合并两个有序数组 以下是使用 C 实现合并两个有序数组的代码及测试用例 C代码实现 #include <iostream> #include &l…

HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)

前言 没经历过的童鞋&#xff0c;首次对HarmonyOS的应用签名打包上架可能感觉繁琐。需要各种秘钥证书生成和申请&#xff0c;混在一起也分不清。其实搞清楚后也就那会事&#xff0c;各个文件都有它存在的作用。 HarmonyOS通过数字证书与Profile文件等签名信息来保证鸿蒙应用/…