【设计模式】| 修炼内功 | 23种设计模式——工厂方法模式(含抽象)

news2024/12/24 0:00:42

设计模式如同织锦之艺术,精心构筑,展示优美。
学习设计模式,犹如追逐清晨的曙光,扉页掀开了人生的新篇章。当你学会设计模式的奥秘,就如同走进了灯火通明的城市,丰富多彩的建筑,让你大开眼界,拥有了整个世界般的视野。
设计模式如同一面明镜,让人自省和反思,看清自己的不足;同时也是一盏明灯,照亮你前行的道路。
它像是一座桥,将你从学生的世界带入到职业的殿堂,让你稳步前行。
学习设计模式,让你的代码更有灵魂,更有温度,更有品味。
它是一种成长,是一种提升,更是一种追求卓越的态度。
让我们一起学习设计模式,饱览编程之美!

快来和🦁一起学习设计模式叭,修炼内功无上心法!!!
在这里插入图片描述

设计模式目录

  • 一. 🦁 设计模式🌟知道
    • 1. 创建型模式:
    • 2. 结构型模式:
    • 3. 行为型模式:
  • 二. 🦁 目标掌握🌟
    • 1. 工厂模式
      • Ⅰ. 代码实现
      • Ⅱ. 使用场景
    • 2. 抽象工厂模式
      • Ⅰ. 代码实现
      • Ⅱ. 使用场景
  • 三. 🦁 学习总结🌟

一. 🦁 设计模式🌟知道

23种设计模式可以按照其功能划分为三类,分别是创建型模式、结构型模式和行为型模式,具体如下:

1. 创建型模式:

  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)
  • 单例模式(Singleton)
  • 建造者模式(Builder)
  • 原型模式(Prototype)

2. 结构型模式:

  • 适配器模式(Adapter)
  • 桥接模式(Bridge)
  • 组合模式(Composite)
  • 装饰器模式(Decorator)
  • 外观模式(Facade)
  • 享元模式(Flyweight)
  • 代理模式(Proxy)

3. 行为型模式:

  • 职责链模式(Chain of Responsibility)
  • 命令模式(Command)
  • 解释器模式(Interpreter)
  • 迭代器模式(Iterator)
  • 中介者模式(Mediator)
  • 备忘录模式(Memento)
  • 观察者模式(Observer)
  • 状态模式(State)
  • 策略模式(Strategy)
  • 模板方法模式(Template Method)
  • 访问者模式(Visitor)

以上23种设计模式都是经典的设计模式,它们被广泛应用于软件开发中,以提高代码的可复用性、扩展性、灵活性和可维护性。

二. 🦁 目标掌握🌟

1. 工厂模式

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

Ⅰ. 代码实现

// 定义一个接口
interface Animal {
   void speak();
}

// 定义Dog类实现Animal接口
class Dog implements Animal {
   @Override
   public void speak() {
      System.out.println("汪汪汪!");
   }
}

// 定义Cat类实现Animal接口
class Cat implements Animal {
   @Override
   public void speak() {
      System.out.println("喵喵喵!");
   }
}

// 定义动物工厂类,用于创建不同类型的动物对象
class AnimalFactory {
   public Animal createAnimal(String animalType) {
      if (animalType.equalsIgnoreCase("dog")) {
         return new Dog();
      } else if (animalType.equalsIgnoreCase("cat")) {
         return new Cat();
      }
      return null;
   }
}

// 测试代码
public class FactoryMethodDemo {
   public static void main(String[] args) {
      AnimalFactory animalFactory = new AnimalFactory();

      // 创建Dog对象并调用speak方法
      Animal dog = animalFactory.createAnimal("DOG");
      dog.speak();

      // 创建Cat对象并调用speak方法
      Animal cat = animalFactory.createAnimal("CAT");
      cat.speak();
   }
}

Ⅱ. 使用场景

JDBC连接数据库,硬件访问,降低对象的产生和销毁

2. 抽象工厂模式

是一种工厂模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

Ⅰ. 代码实现

  1. 场景:假设有一个“图形”接口,具有一个“绘制”方法。现在需要实现两个具体的图形类:矩形和圆形。同时,还需要实现一个“图形工厂”接口,其中包含两个方法:一个用于创建矩形,另一个用于创建圆形。最后,我们需要一个“工厂生成器”类,用于创建不同类型的图形工厂。

  2. 代码如下:

首先,创建“图形”接口:

public interface Shape {
    void draw();
}

接着,创建具体的图形类:矩形和圆形。它们都实现了“图形”接口。

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

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

最后,创建“工厂生成器”类,用于创建不同类型的图形工厂。在本例中,我们仅实现了两种类型的图形工厂:“简单工厂”和“高级工厂”。

public class FactoryGenerator {
    public static ShapeFactory createFactory(boolean simple) {
        if (simple) {
            return new SimpleShapeFactory();
        } else {
            return new AdvancedShapeFactory();
        }
    }
}

public class SimpleShapeFactory implements ShapeFactory {
    @Override
    public Shape createRectangle() {
        return new Rectangle();
    }

    @Override
    public Shape createCircle() {
        return new Circle();
    }
}

public class AdvancedShapeFactory implements ShapeFactory {
    @Override
    public Shape createRectangle() {
        // some advanced logic to create a rectangle
        return new Rectangle();
    }

    @Override
    public Shape createCircle() {
        // some advanced logic to create a circle
        return new Circle();
    }
}

现在,我们就可以使用“工厂生成器”来创建指定类型的“图形工厂”。

public class Main {
    public static void main(String[] args) {
        ShapeFactory simpleFactory = FactoryGenerator.createFactory(true);
        Shape rectangle = simpleFactory.createRectangle();
        rectangle.draw();

        ShapeFactory advancedFactory = FactoryGenerator.createFactory(false);
        Shape circle = advancedFactory.createCircle();
        circle.draw();
    }
}

输出:

Inside Rectangle::draw() method.
Inside Circle::draw() method.

这就是一个简单的 Java 抽象工厂模式实例。

Ⅱ. 使用场景

一个对象族(或是一组没有任何关系的对象)都有相同的约束。涉及不同操作系统的时候,都可以考虑使用抽象工厂模式

三. 🦁 学习总结🌟

本文分享了23种设计模式之一的工厂方法模式(含抽象),小伙伴们一起干起来叭!!!

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

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

相关文章

30个最常用的空间SQL用例

在开始使用空间 SQL 时,至少对我而言,最大的挑战之一是拥有一个快速简便的参考,以将你当前的 GIS 工作流转换为 SQL。 有许多令人惊叹的资源可以扩展这方面的知识,但本指南旨在成为一本真正简单的食谱,以开始将你当前的…

从零开始的强化学习入门学习路线

强化学习是机器学习领域中的一个分支,它是指智能体通过与环境的交互来学习如何采取最佳行动以最大化奖励信号的过程。强化学习在许多领域都有广泛的应用,如游戏、自动驾驶和机器人控制等。如果你对强化学习感兴趣,下面是一个入门强化学习的学…

SequoiaDB分布式数据库2023.4月刊

本月看点速览 赋能产业升级,荣获新睿之星 聚焦金融,进一步探索非结构化数据价值释放 再获肯定,入选2023年中国最佳信创厂商入围名单 青杉计划2023已开启,一起攀登更高的“杉” 赋能产业升级,荣获新睿之星 4月18日…

PyTorch典型函数之gather

PyTorch典型函数之gather 作用描述函数详解典型应用场景(1) 深度强化学习中计算损失函数 参考链接 作用描述 如上图所示,假如我们有一个Tensor A(图左),要从A中提取一部分元素组成Tensor B(图右)&#xff0…

7.外观模式C++用法示例

外观模式 一.外观模式1.原理2.特点3.外观模式与装饰器模式的异同4.应用场景C程序示例 一.外观模式 外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,隐藏了一个或多个复杂的子系统的复杂性,并使…

图嵌入表示学习—Node Embeddings随机游走

Random Walk Approaches for Node Embeddings 一、随机游走基本概念 想象一个醉汉在图中随机的行走,其中走过的节点路径就是一个随机游走序列。 随机行走可以采取不同的策略,如行走的方向、每次行走的长度等。 二、图机器学习与NLP的关系 从图与NLP的…

posix线程的优先级测试

如果创建的线程不够多&#xff0c;有些问题是体现不出来的。 优先级打印&#xff1a; 测试目的&#xff1a;输出三种调度模式下的最大优先级和最小优先级 #include <stdio.h> #include <sys/socket.h> #include <sys/types.h> #include <fcntl.h> #…

Kubernetes_容器网络_01_Docker网络原理(二)

文章目录 一、前言二、被隔离的Docker容器三、网桥Bridge四、VethPair网络对五、统一宿主机上的两个Container容器通信六、宿主机访问其上的容器七、宿主机上的容器访问另一个宿主机八、尾声 一、前言 二、被隔离的Docker容器 Linux 网络&#xff0c;就包括&#xff1a;网卡&…

技术选型对比- RPC(Feign VS Dubbo)

协议 Dubbo 支持多传输协议: Dubbo、Rmi、http,可灵活配置。默认的Dubbo协议&#xff1a;利用Netty&#xff0c;TCP传输&#xff0c;单一、异步、长连接&#xff0c;适合数据量小(传送数据小&#xff0c;不然影响带宽&#xff0c;响应速度)、高并发和服务提供者远远少于消费者…

UnityWebGL+阿里云服务器+Apache完成项目搭建展示

一、服务器相关 Step1:租借一台阿里云服务器 我自己租借了一台北京的ECS服务器&#xff0c;有免费一年的活动&#xff0c;1 vCPU 2 GiB&#xff0c;我自己选择的Ubuntu系统&#xff0c;也可以选择Windows系统 Step2:进入远程连接 进入自己的服务器实例后&#xff0c;点击远程…

vue+elementui+nodejs机票航空飞机航班查询与推荐

语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode )本系统主要是为旅客提供更为便利的机票预定方式&#xff0c;同时提高民航的预定机票的工作效率。通过网络平台实现信息化和网络化&am…

关于Android的性能优化,主要是针对哪些方面的问题进行优化

前言 我们在开发Android的时候&#xff0c;经常会遇到一些性能问题&#xff1b;例如&#xff1a;卡顿、无响应&#xff0c;崩溃等&#xff0c;当然&#xff0c;这些问题为我们可以从日志来进行追踪&#xff0c;尽可能避免此类问题的发生&#xff0c;要解决这些问题&#xff0c…

mysql从零开始(05)----锁

全局锁 使用 # 启用全局锁 flush tables with read lock # 释放全局锁 unlock tables开启全局锁后&#xff0c;整个数据库就处于只读状态了&#xff0c;这种状态下&#xff0c;对数据的增删改操作、对表结构的更改操作都会被阻塞。 另外&#xff0c;当会话断开&#xff0c;全…

【1015. 可被 K 整除的最小整数】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给定正整数 k &#xff0c;你需要找出可以被 k 整除的、仅包含数字 1 的最 小 正整数 n 的长度。 返回 n 的长度。如果不存在这样的 n &#xff0c;就返回 -1。 注意&#xff1a; n 不符合 64 位带…

手把手教你在winform中将文本或文件路径拖到控件中

文章目录 前言博主履历介绍&#xff1a;一、将txt文件的所有内容复制到 RichTextBox中二、将txt文件的一行内容移动到RichTextBox中三、将多个文件的全路径复制到 RichTextBox中四 、源码1、[Winform从入门到精通&#xff08;1&#xff09;——&#xff08;如何年入30万&#x…

「MIAOYUN」:降本增效,赋能传统企业数字化云原生转型 | 36kr 项目精选

作为新经济综合服务平台第一品牌&#xff0c;36氪自2019年落地四川站以来&#xff0c;不断通过新锐、深度的商业报道&#xff0c;陪跑、支持四川的新经济产业。通过挖掘本土优质项目&#xff0c;36氪四川帮助企业链接更多资源&#xff0c;助力企业成长&#xff0c;促进行业发展…

分布式系统概念和设计——命名服务设计和落地经验

分布式系统概念和设计 通过命名服务&#xff0c;客户进程可以根据名字获取资源或对象的地址等属性。 被命名的实体可以是多种类型&#xff0c;并且可由不同的服务管理。 命名服务 命名是一个分布式系统中的非常基础的问题&#xff0c;名字在分布式系统中代表了广泛的资源&#…

C语言:指针求解鸡兔同笼问题

题目&#xff1a;鸡兔同笼问题 要求&#xff1a;使用自定义函数void calc(int h, int f,int *c,int *r) 求解鸡兔同笼问题。 h 表示总的头数&#xff0c;f 表示总的脚数。 例子&#xff1a; 输入&#xff1a; 5 16 输出&#xff1a; 2 3 分析&#xff1a; 在该代码中&a…

05-Docker安装Mysql、Redis、Tomcat

Docker 安装 Mysql 以安装 Mysql 5.7为例&#xff1a; docker pull mysql:5.7Mysql 单机 Mysql 5.7安装 启动 Mysql 容器&#xff0c;并配置容器卷映射&#xff1a; docker run -d -p 3306:3306 \--privilegedtrue \-v /app/mysql/log:/var/log/mysql \-v /app/mysql/data:…

ASP.NET Core MVC 从入门到精通之文件上传

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…