设计模式随记

用友YonSuite产品实操手把手教学(图文版) 用友YonSuite 阅读详情

设计模式

设计模式简介 | 菜鸟教程 (runoob.com)

创建型模式

这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活

一、工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

📌在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

public interface Shape {
   void draw();
}

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

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


public class ShapeFactory {
   public Shape getShape(String shapeType){
      if(shapeType == null){
         return null;
      }        
      if(shapeType.equalsIgnoreCase("CIRCLE")){
         return new Circle();
      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
         return new Rectangle();
      } else if(shapeType.equalsIgnoreCase("SQUARE")){
         return new Square();
      }
      return null;
   }
}



二、抽象工厂模式

说白了就是有个抽象工程,里面有调用获取某些工厂类的接口

三、单例模式

public class Singleton {  
    private volatile static Singleton singleton;  
    private Singleton (){}  
    public static Singleton getSingleton() {  
    if (singleton == null) {  
        synchronized (Singleton.class) {  
            if (singleton == null) {  
                singleton = new Singleton();  
            }  
        }  
    }  
    return singleton;  
    }  
}

四、建造者模式,

如bulider、一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。

五、原型模式

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

例如JAVA 中的 Object clone() 方法。

结构型模式

这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。

一、适配器模型

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。

二、桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。

三、过滤器模式

过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

四、组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。

五、装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。

这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。

六、外观模式

外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

七、享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。

享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。

八、代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

J2EE 模式

这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的

一、服务定位模式

当我们想要使用JNDI1查找定位各种服务时,使用服务定位器设计模式.考虑到为服务查找JNDI的高成本,Service Locator模式使用缓存技术.第一次需要服务时,Service Locator在JNDI中查找并缓存服务对象.通过Service Locator进行进一步查找或相同的服务在其缓存中完成,这在很大程度上提高了应用程序的性能.以下是此类设计模式的实体.

  • 服务 - 实际服务将是处理请求.在JNDI服务器中查看此类服务的引用.
  • 上下文/初始上下文 - JNDI上下文包含对服务的引用用于查找目的.
  • 服务定位器 - 服务定位器是通过JNDI查找缓存服务来获取服务的单点联系人.
  • 缓存 - 用于存储服务引用的缓存以重用它们
  • 客户端 - 客户端是通过ServiceLocator调用服务的对象

📌通俗讲,即利用缓存,当用户访问某一服务时,先从缓存中检查是否有该服务对象,如果没有再重新创建该对象。

  1. 创建service接口
public interface Service {

    void execute();

    String getName();

}
  1. 创建实现类

实现Service1

public class Service1 implements Service {

    public Service1() {
    }

    @Override
    public void execute() {
        log.info("执行" + name() + "方法");
    }

    @Override
    public String getName() {
        return "Service1";
    }
}

实现Service2

public class Service2 implements Service {

    public Service2() {
    }

    @Override
    public void execute() {
        log.info("执行" + name() + "方法");
    }

    @Override
    public String getName() {
        return "Service2";
    }
}
  1. JNDI查找创建InitialContext
public class InitialContext {
    public Service lookup(String jndiName) {
        if (jndiName.equalsIgnoreCase("SERVICE1")) {
            return new Service1();
        } else if (jndiName.equalsIgnoreCase("SERVICE2")) {
            return new Service2();
        }
        return null;
    }
}
  1. 创建缓存类
public class Cache {
    private final List<Service> services;

    public Cache() {
        services = new ArrayList<>();
    }

    public Service getService(String serviceName) {
        return services.stream().filter(
                i -> i.getName().equalsIgnoreCase(serviceName)
        ).findFirst().orElse(null);
    }

    public void addService(Service newService) {
        if (newService != null && services.stream().noneMatch(
                i -> i.getName().equalsIgnoreCase(newService.getName())
        )) {
            services.add(newService);
        }
    }
}
  1. 创建服务定位器
public class ServiceLocator {
    private static final Cache cache;

    static {
        cache = new Cache();
    }

    public static Service getService(String jndiName) {
        Service service = cache.getService(jndiName);
        if (service == null){
            InitialContext context = new InitialContext();
            service = context.lookup(jndiName);
            cache.addService(service);
        }
        return service;
    }
}
  1. Test
        ServiceLocator.getService("Service1").execute();
        ServiceLocator.getService("Service2").execute();
  1. 借助spring进行代码简化

a. 增加工厂类,name对应component名称

public interface ServiceFactory {
    Service getService(String name);
}

b. 对应的service实现类都加上Component注解

@Component("Service2")
public class Service2 implements Service

@Component("Service1")
public class Service1 implements Service

​ c. 增加配置类,调用spring的服务定位工厂类来获取对应service实现类

   @Bean("serviceFactory")
    public ServiceLocatorFactoryBean serviceLocator() {
        ServiceLocatorFactoryBean bean = new ServiceLocatorFactoryBean();
        bean.setServiceLocatorInterface(ServiceFactory.class);
        return bean;
    }

​ d. 测试

    @Resource(name = "serviceFactory")
    private ServiceFactory serviceFactory;

    @Test
    void test(){
        serviceFactory.getService("Service1").execute();
        serviceFactory.getService("Service2").execute();
    }

  1. Java命名和目录接口(Java Naming and Directory Interface,JNDI)的简称 ↩︎

从SPI协议到文件系统:手把手教你用HAL库给W25Q16移植FATFS(附扇区管理优化方案) 本文详细介绍了如何在STM32平台上,通过HAL库的SPI接口为W25Q16 Flash芯片移植FATFS文件系统。文章从SPI通信基础讲起,深入解析了FATFS底层驱动(diskio.c)的移植要点,并重点探讨了针对W25Q16的4KB物理扇区特性进行扇区管理优化的两种方案,旨在帮助开发者构建稳定高效的文件存储方案。 阅读详情

相关推荐

.ipynb文件深度解析:从JSON结构到Jupyter Notebook高效使用指南

在Python开发与数据处理领域,交互式编程正成为探索数据与验证思路的高效方式。Jupyter Notebook作为最流行的交互式环境之一,其默认文件格式.ipynb本质是一个基于JSON的文本文件,内部通过单元格组织代码、说明文字与运行结果。理解其JSON结构,不仅有助于掌握Notebook的存储原理,更能为文件损坏修复、版本控制与自动化转换提供基础。依托对单元格类型、魔法命令及输出可视化的熟练运用,数据分析和数据可视化流程可以变得更为流畅。同时,借助VS Code、nbconvert等工具,开发者能将.

weixin_28839629的博客 350

设计模式学习系列 -- 随记

最近可能工作生活上的稳定慢慢感觉自己丢失掉了从前对生活的冲劲,行业的那种压迫感也小了些,没有这些压力好吗?可能也好,但总会有种未雨绸缪的感觉,看到身边的同学朋友集成家业从医从政,相反程序员这个行业可能青春期就那么几年,需要为自己的以后考虑,要看得长久。可能也需要强迫自己去深入的学习一些知识,形成自己的东西,保持前进的脚步,就从设计模式开始吧...一、设计模式是什么?设计模式是软件设计中常见问题的典型解决方案。它们就像能根据需求进行调整的预制蓝图,可用于解决代码中反复出现的设计问题。

慢慢 1562

解决fetch_california_housing数据集403错误的三种实用方法

本文针对机器学习初学者加载fetch_california_housing数据集时常见的HTTPError 403: Forbidden错误,提供了三种经过实测的解决方案。详细介绍了手动下载与本地替换、修改源码下载路径以及配置网络访问策略的具体步骤,帮助用户根据自身网络环境和开发场景选择最佳方法,确保数据集顺利加载。

weixin_29074295的博客 550

初学Java设计模式随记 -- 为什么学习设计模式

这段时间在学习设计模式,不过,有人对我说,现在设计模式已经过时了。不禁要思考: 为什么要学习设计模式?学习设计模式的目的是什么?设计模式能带来什么?   网友们和各个大师的总结和概括已经非常精辟了。从论坛和书中摘录一些段落,并标注一些对本人启发较大的片断。通过今后不断地更新、整理和回顾这些总结,相信能对设计模式的学习和使用起到更大的启发和指导作用。   设计模式的宗旨和目的:   ...

louis_lee7812的专栏 285

腾讯2020 unreal虚幻面试题

解析一下,腾讯的unreal客户端面试题: 1.lua性能优化的方向 申请的内存,是造成卡顿的原因之一,在C++与lua交互中,如果参数或者返回值有类变量,那么这个变量不会再交互的栈中存放数据,而会通过申请内存,再指定在交互,这样就造成卡顿,因此可以通过把C++的对象的每个参数分开单独传递,可以解决问题,当时我们游戏改完这个问题后,整体提升了2帧。 其实,主要是Tick循环中,减少与C++的交互,需要的数据不要每帧都去拿,其次,经常拿的一些数据(比方说主角信息),可以做一个lua缓存,...

qq_17347313的博客 1万+

告别单一帧:在CFD-POST中完整加载Fluent瞬态计算结果的实战指南

本文详细介绍了在CFD-POST中完整加载Fluent瞬态计算结果的实战指南,解决工程师常见的只能看到最后一帧数据的问题。通过Fluent端的正确设置和CFD-POST端的完整加载技巧,帮助用户高效处理瞬态数据,提升后处理效率。文章还提供了常见问题排查、性能优化和高级后处理技巧,适用于Workbench环境下的流体流动分析。

weixin_29284657的博客 540

设计模式 学习随记

1、如果需生成的产品分类(判断)过多,用抽象来包装所有种类,然后通过多态,避免了在客户端使用时太过具化,增加了系统的扩展性。 2、工厂模式针对产品,缺点是引起产品泛滥;抽象工厂模式针对产品系列,缺点是不便于对具体的一个产品进行操作。 3、一种简单的循环写法  String[] names={}; for(String name:names){ name... } 4、对扩展开放,对修

Mr.An 的专栏 999

CMU开源NavRL:深度强化学习如何破解无人机动态避障难题?

卡内基梅隆大学(CMU)开源了NavRL框架,利用深度强化学习解决无人机在复杂环境中的动态避障难题。该框架通过创新的状态表示、多目标奖励函数设计以及独立的安全屏障机制,使无人机能够通过仿真训练自主学会灵活、安全的导航策略,并成功实现从仿真到真实环境的零样本迁移。

hope8的博客 720

初学Java设计模式随记 -- 带着疑问学习设计模式

最近在学习设计模式时,发现总是会有一些疑问,有的能找到答案,有的不能找到答案。如下:   1.   在相同的场景下,如果不使用模式,会有什么问题? 2.   使用了模式后,解决了什么问题?还有什么问题没有解决?会不会带来新的问题?   3.   解决同样的问题,是不是只有一种模式可用? 4.   如果有多个模式可以使用,那么,哪一个是最合适的?还是需要结合使用?   5.   相似...

louis_lee7812的专栏 245

AutoCAD矢量数据导出全攻略:GIS4CAD插件一键转shp/mdb/kml(附安装包)

本文详细介绍了GIS4CAD插件如何高效解决AutoCAD矢量数据向GIS格式转换的难题。通过一键操作,用户可将CAD中的规划图、地形图等无损转换为行业标准的shp、mdb、kml等多种格式,并确保属性完整与坐标准确。文章提供了从插件安装、数据准备到实战导出的全流程指南,是城市规划、测绘等领域专业人士提升数据互操作效率的必备攻略。

a2b3c4d5e的博客 286

YOLOv8改进有效系列目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好,本专栏自开设两个月以来已经更新改进教程120+余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新,订阅本专栏以后你不仅可以收获跟专栏的阅读权限,同时可以进Qq群,里面包含集成我所有创新的YOLO最新目录,和我本人录制的视频讲解教程,如果你想要在YOLOv8系列收获一篇论文,我相信订阅本专栏后你一定会有所收获~YOLOv8改进有效系列目录。

Snu77的博客 18万+

初学Java设计模式随记 -- GOF 设计模式分类

  以下摘自《GOF设计模式 可复用面向对象软件的基础》中文版。         我们根据两条准则(表1 - 1 )对模式进行分类。 第一是目的准则,即模式是用来完成什么工作的。 模式依据其目的可分为: 创建型( C r e a t i o n a l )、结构型( S t r u c t u r a l )、或行为型( B e h a v i o r a l )三种。 1....

louis_lee7812的专栏 253

python基础:工作会用到的90%的python代码都在这了(万字详解!)

Python 备忘单是 Python 3 编程语言的单页参考表 著名的“Hello World”程序在 Python 中的实现 Python 不能在没有赋值的情况下声明变量 变量可以存放不同类型的值 内置数据类型 序列指一批有序的元素,集合指一批无序且不重复的元素查看: 数据类型 查看: 字符串 查看: 列表 查看: 判断 查看: 循环 查看: 函数 查看: 文件处理 表示 x 和 y 的商, 表示 x 和 y 的底商,另见 StackOverflow f-字符串 (Python 3.6+) 查看

数据知道的博客 1万+

《JavaScript设计模式与开发实践》随记——面向对象

面向对象

acaiEncode的博客 350

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

设计模式之工厂方法模式随记

1, 工厂模式:在工厂中不生产具体的实例,

zwx_20092029的专栏 343

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

初学Java设计模式随记 -- 工厂模式(Factory Pattern) 续

利用工厂模式可以将对象的创建过程和使用进行分离(也就是解藕),从而促进了对象创建过程的封装。 在回顾前一篇随记初学Java设计模式随记 -- 工厂模式(Factory Pattern)中例子1和例子4时,可能会有这么几个的疑问:   为什么要有一个抽象产品类? 为什么工厂方法返回的是一个抽象产品类类型? 为什么在客户端调用时,也是通过抽象产品类来定义要产品类对象?   这就是...

louis_lee7812的专栏 239

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

预览文章: 初学Java设计模式随记 -- 建造者(BUILDER)模式

  建造者(BUILDER)模式又叫生成器(BUILDER)模式。它的定义如下:(参见GoF的设计模式与阎宏的《Java与模式》) 1. 用意:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。   2. 参与者: • 抽象建造者(Builder): 为创建一个产品(Prodcut)对象的各个部件指定抽象接口。• 具体建造者(ConcretBuilder):  ...

louis_lee7812的专栏 259

初学Java设计模式随记 -- 工厂方法(Factory Method)模式

工厂方法(Factory Method)模式,又叫做虚拟构造子模式或者多态性工厂模式。   1.用意:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 ( Define an interface for creating an object, but let subclasses decide which class to in...

louis_lee7812的专栏 257

初学Java设计模式随记 -- 装饰(Decorator)模式

装饰(Decorator)模式又叫包装器(Wrapper)模式。   1. 用意动态地给一个对象添加一些额外的职责。   2. 参与者• 抽象构件(Component):定义一个对象接口,可以给这些对象动态地添加职责。• 具体构件(Concrete Component):定义一个对象,可以给这个对象添加一些职责。• 抽象装饰者(Decorator):持有一个构件(Component)对象的...

louis_lee7812的专栏 312

初学Java设计模式随记 -- 单例(Singleton)模式

本篇内容主要摘取自GoF的设计模式和阎宏的《Java与模式》    单例(Singleton)模式,也叫单件模式。定义如下:(参照GoF设计模式)   1. 用意: 保证一个类仅有一个实例,并提供一个访问它的全局访问点。   2.参与者:• 单例类(Singleton)— 定义一个getInstance()操作,允许客户访问它的唯一实例。getInstance()是一个类操作(一个静...

louis_lee7812的专栏 265

初学Java设计模式随记 -- 工厂模式(Factory Pattern)

  在阎宏《JAVA与设计模式》中 ,工厂模式(Factory Pattern)分为下列几种形态: 1.简单工厂(Simple Factory)模式: 又称静态工厂方法模式(Static Factory Method Pattern). 2.工厂方法(Factory Method)模式:又称多态性(Polymorphic Factory)模式或虚拟构造子(Virtual Construtor...

louis_lee7812的专栏 235

初学Java设计模式随记 -- 简单工厂模式(Simple Factory Pattern)

简单工厂(Simple Factory)模式: 又称静态工厂方法模式(Static Factory Method Pattern)。   简单工厂模式并没有被包含在GOF的23种设计模式中。 不过,在阎宏《Java与模式》给出了简单工厂(Simple Factory)模式的定义。 它是工厂模式的一种形态。   1.用意:简单工厂模式就是有一个工厂类根据传入的参量决定创建出那一种产品类的...

louis_lee7812的专栏 274

(随记三)Android设计模式解析与实战_面对对象六大原则之里式替换原则

(随记三)Android设计模式解析与实战_面对对象六大原则之里式替换原则 :* 构建扩展性更好的系统 * 定义 : 所有引用基类的地方必须能透明的使用其子类对象 * 简单来说就是 : 只要父类能出现的地方,子类就能出现 , 并且替换为子类也不会产生任何错误 。在随即二中的缓存类代码也很好的提现了里式替换的原则,即DiskCache,MemoryCache与DoubleCached都可以替代Imag

yitao_的博客 418

初学Java设计模式随记 -- 抽象工厂(Abstract Factory)模式

 抽象工厂(Abstract Factory)模式的定义如下:    1. 用意: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 (Provide an interface for creating families of related or dependent objects without specifying their concrete classes.) ...

louis_lee7812的专栏 277
上一篇: ThreadLocal
下一篇: TCP三次握手四次挥手
strap
博客等级 码龄3年 60粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值