设计模式概述(一)

news2024/11/28 0:52:37

很多小伙伴,不知道设计模式是什么?

通常我们所说的设计模式是一种设计方案,是前人留下的经验及最佳实践。

想要学习设计模式,至少要把面向对象的基本结构全部了解。

设计模式,是建立在一定基础上的思维训练。

学习设计模式,要有面临痛苦的决心。

学会设计模式,对解决问题及对程序理解有更高层次的认识。

如果有这样的决心,那么下面我们就认识一下,它的真面目。


从基础的角度看,设计模式是研究类本身或者类与类之间的协作模式,是进行抽象归纳的一个很好的速成思路。

从技术的角度已经有很多好的总结,本文会换一种角度思考,既然设计模式研究的是类与类的关系,我们作为工作的个体,一些工作中的策略是不是也可以进行类比,可以更好地去思考这些模式?答案是肯定的。


常说的设计模式是23种设计模式,分为3大类:

  • 创建型模式5种:工厂方法、抽象工厂、单例、建造者、原型
  • 结构型模式7种:适配器、代理、桥接、装饰者、外观、享元、组合
  • 行为型模式11种:模板方法、解释器、策略、观察者、迭代器、职责链、命令、备忘录、状态、访问者、中介者。

当然有一部分模式中,还有一些小的变化,在未来的持续更新中,我们会一一列举,并以代码为主,去学习设计模式。


今天先说简单工厂模式:

基本思想是:定义一个工厂类,可以根据参数的不同返回不同类的实例,被创建的实例通常具有共同的父类。

特点是:需要什么类对象时,只需要传入一个正确的参数,就可以获得所需要的对象,而无需知道其创建细节。

 

简单工厂模式,不属于23种设计模式中的任何一种,但是,它是从工厂模式中简化而来的。

工厂模式中,重点需要抓住,“制造产品”这句话,就容易入门,从而进一步学习和理解。

首先,工厂要有产品,而工厂就是在创建产品,主要功能也是在创建产品,对于程序来书,是实例化对象的程序。

示例:假设“女娲造人”的神话传说中,产品是人类,分男人和女人。我们要事先准备好,人类,男人类和女人类,而这三个类将通过简单工厂方法创建出符合条件的对象。

  abstract class  Person{
    private final String name;
    private String sex;
    public Person (String name){
        this.name=name;
    }
    public String toString() {
        return "我的名字是"+this.name+" i am "+sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}
//男人
class Man extends Person{
    {
        setSex("Man");
    }
    public Man(String name){
        super(name);
    }
}
//女人
class Women extends  Person{
    {
        setSex("Women");
    }
    public Women(String name){
        super(name);
    }
}

而简单工厂模式,就是根据对产品的选择,而生产对应商品的功能程序。

//简单工厂
class SimpleFactory{
    public static Person getObject(String name,String sex) throws  Exception{
        if(sex.equalsIgnoreCase("man")){
            return new Man(name);
        }else if(sex.equalsIgnoreCase("women")){
            return new Women(name);
        }else{
            throw new Exception("请输入正确的信息");
        }
    }
}

调用执行出效果的程序:

 //创建一个男人叫迪卡
   Person person= SimpleFactory.getObject("迪卡","man");System.out.println(person);
   //创建一个女人叫萨瓦
   person= SimpleFactory.getObject("萨瓦","women");System.out.println(person);

简单工厂的特点:

返回抽象的接口或者父类,由工厂管理子类创建过程

让创建过程变成一个黑盒

封闭创建过程,客户端只需要关注结果。

工厂模式优缺点:

优点:

使用创建工厂的方法,我们实现了获取具体对象和生产对象的解耦,由生产对象的工厂通过我们传入的参数生产对应的对象,调用方只需要传递需要生产的对象来实现具体的效果。

解耦了创建和被创建的过程。

根据不同的逻辑判断生成不同的具体对象。

缺点:

每增加一个工厂对象具体的实现类,就需要增加if/else不利于维护

大量的子类会造成工厂类的迅速膨胀和臃肿

简单工厂的方法一般处理简单的业务逻辑,如果创建逻辑复杂不建议使用。


以上就是今天的分享,如果你感兴趣记得点赞评论哦,以防找不到我。

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

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

相关文章

macos12.6安装配置opencv4.6.0+opencv contrib4.6.0

1.系统准备好,安装依赖python版本高一点的,并且安装上numpy。 brew install cmake gui及cmake,可能装cmake gui的时候有点问题,先装gui再装cmake。 2.提前下载源码,Releases - OpenCV要求opencv与opencv contrib版本一…

Metal每日分享,UV去雾滤镜效果

本案例的目的是理解如何用Metal实现去雾效果滤镜,类似于UV过滤器; Demo HarbethDemo地址 实操代码 // 去雾效果滤镜 let filter C7Haze.init(distance: 0.5, slope: 0.5)// 方案1: ImageView.image try? BoxxIO(element: originImage, filters: [f…

MyBatis ---- MyBatis的逆向工程

MyBatis ---- MyBatis的逆向工程1. 创建逆向工程的步骤a>添加依赖和插件b>创建MyBatis的核心配置文件c>创建逆向工程的配置文件d>执行MBG插件的generate目标2. QBC查询正向工程:先创建 Java 实体类,由框架负责根据实体类生成数据库表。Hiber…

Spring源码深度解析:十五、@Aspect方式的AOP中篇 - getAdvicesAndAdvisorsForBean

一、前言 文章目录:Spring源码深度解析:文章目录 在上篇中我们概述了Aop 实现的逻辑,但是由于篇幅原因,我们将一部分内容拆成了中篇和下篇内容。本篇即中篇,内容主要是讲述 在 Bean创建过程中Aop 挑选适用于当前Bean…

尚医通-MyBatistPlus:修改和自动填充-乐观锁(三)

目录: (1)MyBatistPlus:修改和自动填充 (2)MyBatis-Plus-乐观锁 (1)MyBatistPlus:修改和自动填充 1、更新操作 注意:update时生成的sql自动是动态sql&…

14 - 局部段描述符表

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 什么是局部段描述符表(LDT)1.1 局部段描述符选择子1.2 局部段描述符表LDT1.3 问题1.4 LDT的定义和使用2. 编程实验:使用LDT实现新功能3. 多任务程序设计的实现思路4. 待解决的问题:…

第51篇 Qt 5.5全新的开始

导语 时间转眼而逝,看一下上次发的教程,已经是一年前的事情了。这一年发生了很多事情,包括自己也包括Qt。当然,自己很忙或者说为了编写《Qt 5编程入门》这些理由,并不能为一年的搁置进行开脱,所以这里首先…

人工智能前沿——6款AI绘画生成工具

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 一、【前言】 二、【6款AI绘画生成工具】 1.DeepAI 2.NightCafe 3.Deep Dream Generator 4.StarryAI 5.Fotor 6.Pixso 一、【前言】 AI不仅影响商业和医疗保健等行业&#xff0c;还在创意产业中…

Flutter Web CORS解决方案2-代理转发协议

Flutter Web CORS解决方案2local-cors-proxyshelf_proxydart run shelf_proxyflutter run --dart-definewrap with shellhelp & usagemode & confrun & debuglaunch with proxyvscodeAndroid Studio遗留问题本文介绍第二种解决FlutterWeb CORS问题的方案&#xff1…

[附源码]Nodejs计算机毕业设计基于web的企业人事管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Centos7下Samba服务器配置

环境 vm下centos7.6&#xff0c;IP地址&#xff1a;192.168.139.200 Samba概述 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。SMB&#xff08;Server Messages Block&#xff0c;信息服务块&#xff09;是一种在局域网上共享文…

STM32H747AGI6技术、STM32H747AII6规格、STM32H747BGT6产品概述

产品概述&#xff1a;STM32H7高性能MCU基于高性能Arm Cortex-M7 32位RISC内核&#xff0c;工作频率高达400MHz。Cortex-M7内核具有浮点单元 (FPU) 精度&#xff0c;支持Arm双精度&#xff08;符合IEEE 754标准&#xff09;和单精度数据处理指令与数据类型。STM32H7 MCU支持全套…

第48篇 进阶(八) 3D绘图简介

导语 OpenGL是一个跨平台的用来渲染3D图形的标准API。在Qt中提供了QtOpenGL模块&#xff0c;从而很轻松地实现了在Qt应用程序中使用OpenGL&#xff0c;这主要是在QGLWidget类中完成的。因为3D绘图涉及到了专业方面的内容&#xff0c;我们下面只是讲解最简单的使用&#xff0c;…

Java基础之LinkedList

Java基础之LinkedList一、介绍二、add()一、介绍 底层是一个双向链表实现的List&#xff0c;内部每一个节点采用内部类Node表示&#xff0c;通过first、last引用分别指向链表的第一和最后一个元素非线程安全&#xff0c;可以用Collections.synchronizedList()方法对其进行包装…

Android入门第44天-Android里使用动态BroadCast

BroadCast是什么 BroadcastReceiver就是应用程序间的全局大喇叭&#xff0c;即通信的一个手段&#xff0c; 系统自己在很多时候都会发送广播&#xff0c;比如电量低或者充足&#xff0c;刚启动完&#xff0c;插入耳机&#xff0c;你有一条新的微信消息。。。这种都是使用Broad…

Windows实时运动控制软核(二):LOCAL高速接口测试之Qt

今天&#xff0c;正运动小助手给大家分享一下MotionRT7的安装和使用&#xff0c;以及使用Qt对MotionRT7开发的前期准备。 01 MotionRT7简介 MotionRT7是深圳市正运动技术推出的跨平台运动控制实时内核&#xff0c;也是国内首家完全自主自研&#xff0c; 自主可控的Windows运动…

redis的客户端

关系型数据库存储在磁盘当中&#xff0c;非关系型数据库存储在内存中 Jedis 第一步&#xff1a;导入依赖包 <dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</vers…

操作系统学习笔记

1.1 操作系统的概念、功能和目标 1.1.1 操作系统的功能和目标–系统资源的管理者 进程是一个程序的执行过程。执行前需要将该程序放到内存中&#xff0c;才能被CPU处理。 1.1.2 用户和计算机硬件之间的接口 联机命令接口交互式命令接口 脱机命令接口批处理命令接口 1.1.3…

点击化学标记试剂N3-PEG-DBCO,DBCO-PEG-azide,二苯并环辛炔聚乙二醇叠氮

N3-PEG-DBCO &#xff0c;DBCO PEG N3 &#xff0c;DBCO-PEG-azide&#xff0c;叠氮聚乙二醇环辛炔&#xff0c;二苯并环辛炔聚乙二醇叠氮产品规格&#xff1a; 1.分子量&#xff1a;1k&#xff0c;2k&#xff0c;3.4k&#xff0c;5k&#xff0c;10k&#xff0c;20k&#xff08…

百度地图三维盒子模型标注

效果图 利用百度地图mapv实现地图盒子模型标准 代码 function box() {var griddata [];for (var i 0; i < arr.length; i) {griddata.push({geometry: {type: Point,coordinates: arr[i]},properties: {count: Math.random() * (i 1) * 10000}});}var grid new mapvgl…