设计模式探索:从理论到实践的编码示例 (软件设计师笔记)

news2024/11/24 10:46:03

😀前言
设计模式,作为软件工程领域的核心概念之一,向我们展示了开发过程中面对的典型问题的经典解决方案。这些模式不仅帮助开发者创建更加结构化、模块化和可维护的代码,而且也促进了代码的复用性。通过这篇文章,我们将探讨其中一些基本的设计模式,并为每个模式提供相应的代码示例,以便于更好地理解它们的实际应用。

🏠个人主页:尘觉主页
在这里插入图片描述

🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉😉

在csdn获奖荣誉: 🏆csdn城市之星2名
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓Java全栈群星计划top前5
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🤗 端午大礼包获得者
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 🥰阿里云专家博主
⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 😉亚马逊DyamoDB结营

💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看🥰
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦😊

文章目录

  • 第七章 面向对象技术 补充-上
    • 🔺设计模式
      • 设计模式的要素
      • 创建型设计模式(5种)
      • 1. Simple Factory(简单工厂)
      • 2. Factory Method(工厂方法)
      • 3. Abstract Factory(抽象工厂)
      • 4. Builder(生成器)
      • 5. Prototype(原型)
      • 6. Singleton(单例)
    • 😄总结

第七章 面向对象技术 补充-上

🔺设计模式

设计模式的要素

设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便地复用成功的设计和体系结构

设计模式基本要素:

  • 模式名称(Pattern Name)

  • 问题(Problem)

  • 解决方案(Solution)

  • 效果(Consequences)

      				<img src="https://picgoowyx.oss-cn-guangzhou.aliyuncs.com/imags/202309210851610.png" style="zoom:50%;" />
    

创建型设计模式(5种)

1. Simple Factory(简单工厂)

简单工厂模式属创建型模式,但不属于23种设计模式之一。

定义:定义一个工厂类,他可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。
在简单工厂模式中用于被创建实例的方法通常为静态(static)方法,因此简单工厂模式又被成为静态工厂方法(Static Factory Method)。

															<img src="https://picgoowyx.oss-cn-guangzhou.aliyuncs.com/imags/202309210851611.png" style="zoom:50%;" />
/**
 * 简单工厂模式
 */
public class SimpleFactory {
    public static void main(String[] args) {
        Product productA = Factory.createProduct("A");
        productA.info();

        Product productB = Factory.createProduct("B");
        productB.info();

    }
}

class Factory{
    public static Product createProduct(String type){
        Product product =null;

        switch (type){
            case "A":
                product = new ProductA();
                break;
            case "B":
                product = new ProductB();
                break;
            default:
                System.out.println("没有 " + type + " 类型的产品!");
                return null;
        }
        return product;
    }
}

abstract class Product{
    public abstract void info();
}

class ProductA extends Product{

    @Override
    public void info() {
        System.out.println("产品的信息:A");
    }
}

class ProductB extends Product{

    @Override
    public void info() {
        System.out.println("产品的信息:B");
    }
}

2. Factory Method(工厂方法)

1)意图

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

2)结构

												<img src="https://picgoowyx.oss-cn-guangzhou.aliyuncs.com/imags/202309210851612.png" style="zoom:50%;" />
/**
 * 工厂方法模式
 */
public class FactoryMethod {
    public static void main(String[] args) {
    
        // 父类 对象名 = new 子类();
        Factory factoryA = new FactoryA();
        Product productA = factoryA.createProduct();
        productA.info();

        Factory factoryB = new FactoryB();
        Product productB = factoryB.createProduct();
        productB.info();

    }
}

interface Factory{
   Product createProduct();
}

class FactoryA implements Factory{

    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

class FactoryB implements Factory{

    @Override
    public Product createProduct() {
        return new ProductB();
    }
}

interface Product{
    void info();
}

class ProductA implements Product{

    @Override
    public void info() {
        System.out.println("产品的信息:A");
    }
}

class ProductB implements Product{

    @Override
    public void info() {
        System.out.println("产品的信息:B");
    }
}

3)适用性

Factory Method 模式适用于:

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

3. Abstract Factory(抽象工厂)

1)意图

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。

2)结构

/**
 * 抽象工厂模式
 */
public class AbstractFactory {

    public static void main(String[] args) {
        Factory factory1 = new Factory1();
        ProductA productA1 = factory1.createProductA();
        productA1.info();
        ProductB productB1 = factory1.createProductB();
        productB1.info();

        Factory factory2 = new Factory2();
        ProductA productA2 = factory2.createProductA();
        productA2.info();
        ProductB productB2 = factory2.createProductB();
        productB2.info();

    }
}

// 声明一个创建抽象产品对象的操作接口
interface Factory{
   ProductA createProductA();
   ProductB createProductB();
}

// 实现创建具体产品对象的操作
class Factory1 implements Factory{

    @Override
    public ProductA createProductA() {
        return new ProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ProductB1();
    }
}

class Factory2 implements Factory{

    @Override
    public ProductA createProductA() {
        return new ProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ProductB2();
    }
}

// 为一类产品对象声明一个接口
interface ProductA{
    void info();
}

interface ProductB{
    void info();
}

// 定义一将被相应的具体工厂创建的产品对象
class ProductA1 implements ProductA{

    @Override
    public void info() {
        System.out.println("产品的信息:A1");
    }
}

class ProductA2 implements ProductA{

    @Override
    public void info() {
        System.out.println("产品的信息:A2");
    }
}

class ProductB1 implements ProductB{

    @Override
    public void info() {
        System.out.println("产品的信息:B1");
    }
}

class ProductB2 implements ProductB{

    @Override
    public void info() {
        System.out.println("产品的信息:B2");
    }
}

3)适用性

Abstract Factory 模式适用于:

  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当提供一个产品类库,只想显示它们的接口而不是实现时。

4. Builder(生成器)

1)意图

将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

2)结构

import java.util.*;

/**
 * 生成器模式
 */
public class Main {

    public static void main(String[] args) {
        Director director = new Director();

        Builder builder1 = new Builder1();
        director.Construct(builder1);
        Product product1 = builder1.getResult();
        product1.show();

        Builder builder2 = new Builder2();
        director.Construct(builder2);
        Product product2 = builder2.getResult();
        product2.show();
    }
}

class Director{
    public void Construct(Builder builder){
        builder.BuildPart();
    }
}

abstract class Builder{
    public abstract void BuildPart();
    public abstract Product getResult();
}

class Builder1 extends Builder{

    Product product = new Product();

    @Override
    public void BuildPart() {
        product.add("A");
        product.add("B");
        product.add("C");
        product.add("D");
        product.add("E");
        product.add("F");
    }

    @Override
    public Product getResult() {

        return product;
    }
}

class Builder2 extends Builder{

    Product product = new Product();

    @Override
    public void BuildPart() {
        product.add("A");
        product.add("B");
        product.add("C");
    }

    @Override
    public Product getResult() {

        return product;
    }
}

class Product{
    List<String> parts = new ArrayList<String>();

    public void add(String part){
        parts.add(part);
    }

    public void show(){
        System.out.print("产品的组成:");
        for (String part : parts) {
            System.out.print(part + " ");
        }
        System.out.println();
    }
}

3)适用性

Builder 模式适用于:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

5. Prototype(原型)

1)意图

用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。

2)结构

其中:

  • Prototype声明一个复制自身的接口。
  • ConcretePrototype 实现一个复制自身的操作。
  • Client 让一个原型复制自身从而创建一个新的对象

/**
 * 原型模式
 */
public class Main {

    public static void main(String[] args) {
        Product product1 = new Product(2022,5.28);
        System.out.println(product1.getId()+ " " + product1.getPrice());

        Product product2 = (Product) product1.Chlone();
        System.out.println(product2.getId()+ " " + product2.getPrice());

    }
}

interface Prototype{
    Object Chlone();
}

class Product implements Prototype{

    private int id;
    private double price;

    public Product(){}

    public Product(int id,double price){
        this.id = id;
        this.price = price;
    }

    public int getId() {
        return id;
    }

    public double getPrice() {
        return price;
    }

    @Override
    public Object Chlone() {
        Product object = new Product();
        object.id = this.id;
        object.price = this.price;

        return object;
    }
}

3)适用性

Prototype 模式适用于:

  • 当一个系统应该独立于它的产品创建、构成和表示时。
  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载。
  • 为了避免创建一个与产品类层次平行的工厂类层次时。
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们,可能比每次用合适的状态手工实例化该类更方便一些。

6. Singleton(单例)

1)意图

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

2)结构

其中:Singleton指定一个Instance操作,允许客户访问它的唯一实例,Instance是一个类

操作:可能负责创建它自己的唯一实例。

/** * 单例模式
 */
public class SingletonPattern {
    public static void main(String[] args) {
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        Singleton instance3 = Singleton.getInstance();

        System.out.println("instance1: " + instance1);
        System.out.println("instance2: " + instance2);
        System.out.println("instance3: "+ instance3);
    }
}

class Singleton{
     private static Singleton instance = new Singleton();

    private Singleton(){};

    public static Singleton getInstance(){
        return instance;
    }
}

3)适用性
Singleton 模式适用于:

  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。

😄总结

经过对各种创建型设计模式的深入探讨和代码实例展示,我们可以更加深入地理解它们如何帮助我们更有效地创建对象。从简单工厂到单例模式,每一种设计模式都有其独特的应用场景和优势。当面对软件设计中的具体问题时,了解如何选择和应用合适的设计模式至关重要。希望本文的内容能为您提供有关设计模式的深入了解,以及如何在实际开发中灵活运用这些模式的启示。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

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

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

相关文章

处理不平衡数据的十大Python库

数据不平衡是机器学习中一个常见的挑战&#xff0c;其中一个类的数量明显超过其他类&#xff0c;这可能导致有偏见的模型和较差的泛化。有各种Python库来帮助有效地处理不平衡数据。在本文中&#xff0c;我们将介绍用于处理机器学习中不平衡数据的十大Python库&#xff0c;并为…

面向对象之旅:核心理念、设计方法与UML详解(软件设计师笔记)

&#x1f600;前言 面向对象技术是现代软件工程的核心&#xff0c;为软件设计和开发带来了一种强大且有序的方法。通过将现实世界的实体和概念映射到可操作的代码结构&#xff0c;该技术使我们能够更高效、清晰和可靠地创建复杂的软件系统。在本章中&#xff0c;我们将详细介绍…

我的国庆回家之路

文章目录 回家的计划假期的礼物学习新技术与家人团聚遇到的趣事总结 &#x1f389;欢迎来到IT陈寒的博客空间~我的国庆回家之路 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;Java学习路线&#x1…

【运维日常】华为云专线实现idc通过nat出网

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

【VUE复习·9】v-for 基础用法(循环渲染也叫列表渲染)

总览 1.v-for 都能循环什么 2.用法 一、v-for 都能遍历什么 能循环的东西包括&#xff1a;数组、对象、字符串&#xff08;和java里面的3个引用数据类型一样&#xff09;、纯粹循环数量&#xff08;少用&#xff09; 二、用法 1.用法1&#xff1a;简单循环&#xff08;遍历…

开源协作开发者内容平台Vrite

什么是 Vrite &#xff1f; Vrite 是一个开源协作空间&#xff0c;用于创建、管理和部署产品文档、技术博客和知识库。它旨在提供高质量、集成的用户和开发人员体验。 Vrite 具有以下功能&#xff1a; 内置管理仪表板&#xff0c;用于使用看板或列表视图管理内容生产和交付&am…

亘古难题:前端开发 or 后端开发

目录 一、引言二、两者的对比分析1. 技能要求和专业知识前端开发后端开发 2. 职责和工作内容前端开发后端开发 3. 项目类型和应用领域前端开发后端开发 4. 就业前景和市场需求前端开发后端开发 三、技能转换和跨领域工作四、介绍全栈开发五、结语附、开源项目微服务商城项目前后…

Java获取给定月份的前N个月份和前N个季度

描述&#xff1a; 在项目开发过程中&#xff0c;遇到这样一个需求&#xff0c;即&#xff1a;给定某一月份&#xff0c;得到该月份前面的几个月份以及前面的几个季度。例如&#xff1a;给定2023-09&#xff0c;获取该月份前面的前3个月&#xff0c;即2023-08、2023-07、2023-0…

2023/9/30 -- ARM

今日任务&#xff1a;消息队列实现进程之间通信方式代码&#xff0c;现象 msgW.c: #include <myhead.h> //消息结构体 typedef struct {long msgtype; //消息类型char data[1024]; //消息正文 }Msg_ds;#define SIZE sizeof(Msg_ds)-sizeof(long) //…

cesium源码无法更新的解决方案

一、环境&#xff1a; 中国移动的宽带 win10操作系统 二、问题复现步骤&#xff1a; 1、开了VPN&#xff0c;设置为全局代理 2、在vscode中执行git pull命令 3、结果显示无法更新 三、解决方案&#xff1a; 1、安装Github官方开发的软件Github Desktop 下载地址&#xf…

(二)Python编程环境搭建

本章重点介绍 Python 编程环境的搭建&#xff0c;包括各个平台下 Python 的下载和安装&#xff0c;常见 IDE 的使用&#xff0c;如何运行 Python 程序等。还会亲自带着大家编写并运行第一个 Python 程序&#xff0c;让大家认识一下最简单的 Python 代码。 本章的后半部分还介绍…

【C++】C++多态——实现、重写、抽象类、原理

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C学习 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【C】C继…

百度面试题:为什么使用接口而不是直接使用具体类?

大家好&#xff0c;我是小米&#xff01;今天&#xff0c;我要和大家聊聊一个在 Java 编程中非常重要的话题&#xff1a;“百度面试题&#xff1a;为什么要使用接口而不是直接使用具体类&#xff1f;”这个问题在很多 Java 面试中都会被问到&#xff0c;因为它涉及到了面向对象…

基于Java的学校运动会信息管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

mysql的mvcc详解

一 MVCC的作用 1.1 mvcc的作用 1.MVCC&#xff08;Multiversion Concurrency Control&#xff09;多版本并发控制。即通过数据行的多个版本管理来实现数据库的并发控制&#xff0c;使得在InnoDB事务隔离级别下执行一致性读操作有了保障。 2.mysql中的InnoDB中实现了MVCC主要…

力扣146|LRU缓存淘汰算法

LRU缓存淘汰算法 leet code146: https://leetcode.cn/problems/lru-cache 一、基本思想 1.1 基本思想 LRU全名Last Recently Used&#xff0c;即当缓存空间满时&#xff0c;优先淘汰最不常使用&#xff08;访问&#xff09;的缓存。 1.2 抽象接口 1、 init() 初始化大小为…

ITSM和ITIL有什么区别?

ITIL是最广泛接受的ITSM方法&#xff0c;是用于管理组织IT运营和服务的最佳实践和建议的框架。它是由英国政府的中央计算机和电信局&#xff08;CCTA&#xff09;在1980年代中期委托创建的。基于ITIL框架构建的ITSM流程为更好的IT服务和改善业务铺平了道路。总而言之&#xff0…

【Java】关于我Debug的一些技巧

文章目录 条件断点断点回退表达式的执行直接返回 条件断点 IDEA中右击断点的时候可以看到如下的状态&#xff0c;在这里的Condition中我们可以选择进入当前断点的一个条件&#xff0c;比如我希望只有keyuser2的时候才进入断点&#xff0c;那么我就可以按照如下的方式去编写条件…

前端架构师之01_JQuery

1 jQuery快速入门 1.1 什么是jQuery 它是一个开源的JavaScript类库 。 常见的JavaScript类库&#xff1a;jQuery、Prototype、ExtJS、Mootools和YUI等。 jQuery的核心理念&#xff1a;write less&#xff0c;do more&#xff08;写的更少&#xff0c;做的更多&#xff09;。…

五、回溯(trackback)

文章目录 一、算法定义二、经典例题&#xff08;一&#xff09;排列1.[46.全排列](https://leetcode.cn/problems/permutations/description/)&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码&#xff08;3&#xff09;复杂度分析 2.[LCR 083. 全排列](https://le…