设计模式可以帮助消除冗余代码。了解如何在Java中使用单例模式、工厂模式和观察者模式。如果你是从事计算机科学或相关学科工作的程序员或学生,很快,你就会遇到一个术语“软件设计模式软件设计模式”。根据维基百科,“软件设计模式是针对普通软件设计工作中遇到的问题的通用的、可重用的解决方案”。我对这个定义的看法是:在进行编码项目时,您经常会想,“好吧,这看起来像是冗余代码,我可以更改这段代码以使其更加灵活和可修改吗?”于是,你开始考虑如何将保持不变的内容与需要经常更改的内容分开。设计模式是一种通过将保持不变的部分与经常更改的部分分开来使代码更易于修改的方法。如果不出意外,从事编程项目的每个人可能都有同样的想法。尤其是那些工业规模的项目,往往有几十个甚至上百个开发人员在工作;协作过程表明,必须有一些标准和规则才能使代码更加优雅和适应变化。这就是我们拥有面向对象编程(OOP)和软件框架工具的原因。设计模式与OOP有点相似,但它更进一步,将变化视为自然开发过程的一部分。基本上,设计模式利用了一些OOP思想,如抽象和接口,但关注变化的过程。当你开始开发项目时,你经常会听到重构这个词,意思是改变代码,使其更优雅和可重用;这就是设计模式大放异彩的地方。当您使用现有代码(无论是过去由其他人还是您自己构建)时,了解设计模式可以帮助您以不同的方式看待事物,并且您会发现问题和改进代码的方法。设计模式有很多种,其中单例模式、工厂模式和观察者模式是最流行的三种,本文将一一介绍。如何遵循本指南无论您是经验丰富的程序员还是新手,我都想让本教程易于每个人理解。设计模式概念不容易理解,开始旅程时减少学习曲线始终是重中之重。因此,除了这篇包含图表和代码片段的文章之外,我还创建了一个GitHub存储库,您可以克隆它并在您的计算机上运行它以实现这三种设计模式。您还可以观看我创建的YouTube视频。先决条件如果您只想了解一般的设计模式思想,则无需克隆示例项目或安装任何工具。但是,要运行示例代码,您需要安装以下工具:Java开发工具包(JDK):我强烈建议使用OpenJDK。ApacheMaven:这个简单的项目是使用ApacheMaven构建的;好消息是许多IDE都附带了Maven。交互式开发编辑器(IDE):我使用IntelliJ的社区版,但您也可以使用EclipseIDE或您喜欢的任何其他JavaIDE。Git:如果你想克隆项目,你需要一个Git客户端。安装Git后,运行以下命令克隆项目:gitclonehttps://github.com/bryantson/OpensourceDotComDemos.git然后在您喜欢的IDE中,您可以将TopDesignPatterns存储库中的代码作为ApacheMaven项目导入。我使用的是Java,但您可以使用任何支持抽象原则的编程语言来实现设计模式。单例模式:避免每次都创建一个对象单例模式是一种非常流行的设计模式,它的实现也比较简单,因为你只需要一个类。然而,许多开发人员争论单例设计模式的好处是否大于风险,因为它缺乏明显的好处并且容易被滥用。很少有开发人员直接实现单例;相反,SpringFramework和GoogleGuice等编程框架具有单例设计模式的内置功能。但是了解单例模式仍然非常有用。单例模式确保一个类只创建一次,并提供一个全局访问点。单例模式:确保只创建一个实例,避免在同一个项目中创建多个实例。下图展示了一个典型的类对象创建过程。当客户请求创建一个对象时,构造函数将创建或实例化一个对象并调用一个方法将这个类返回给调用者。但每次请求对象时都会发生这种情况:调用构造函数,创建一个新对象并返回一个唯一对象。我猜想面向对象语言的创造者每次都创建一个新对象是有原因的,但是单例过程的支持者说这是多余的并且浪费资源。普通类实例化下图使用单例模式创建对象。在这里,只有当对象第一次通过预先设计的getInstance()方法时,构造函数才会被调用。这通常通过检查值是否为null来完成,并且此对象作为私有变量保存在单例类中。下次调用getInstance()时,此类将返回第一个创建的对象。没有创建新对象;它只是返回旧的。单例模式实例化以下代码显示了创建单例模式的最简单方法:packageorg.opensource.demo.singleton;publicclassOpensourceSingleton{privateOpensourceSingleton(){}publicstaticOpensourceSingletongetInstance(){if(uniqueInstance==null){uniqueInstance=newOpensourceSingleton();}返回唯一实例;在调用方,这里是如何调用单例类来获取对象:OpensourcenewObject=Opensource.getInstance();这段代码没问题这验证了单例模式的思想:当调用getInstance()时,它通过检查空值来检查对象是否已经创建。如果该值为null,它会创建一个新对象并将其保存在私有字段中,并将该对象返回给调用者。否则,直接返回之前创建的对象。单例实现的主要问题是它忽略了并行进程。当多个进程使用线程并发访问资源时,就会出现这个问题。针对这种情况有相应的解决方案,叫做多线程安全的双重检查锁,如下:packageorg.opensource.demo.singleton;公共类ImprovedOpensourceSingleton{privatevolatilestaticImprovedOpensourceSingletonuniqueInstance;privateImprovedOpensourceSingleton(){}publicstaticImprovedOpensourceSingletongetInstance(){if(uniqueInstance==null){synchronized(ImprovedOpensourceSingleton.class){if(uniqueInstance==null){uniqueInstance=newImprovedOpensourceSingleton();}}}返回唯一实例;将前一点更进一步,确保仅在您认为安全的情况下才直接实现单例。最好的方法是通过使用制作精良的编程框架来利用单例功能。工厂模式:将对象创建委托给工厂类以隐藏创建逻辑工厂模式是另一种著名的设计模式,但它稍微复杂一些。工厂模式的实现方式有很多种,下面的代码示例是最简单的实现方式。为了创建对象,工厂模式定义了一个接口,让其子类决定实例化哪个类。工厂模式:将对象的创建委托给一个工厂类,这样就可以隐藏创建逻辑。下图展示了最简单的工厂模式是如何实现的。工厂模式客户端请求工厂类创建一些类型为x的对象,而不是客户端直接调用对象创建。根据其类型,工厂模式决定创建和返回哪些对象。在下面的代码示例中,OpensourceFactory是工厂类实现,它从调用者那里获取类型并根据该输入决定创建和返回哪个对象:packageorg.opensource.demo.factory;publicclassOpensourceFactory{publicOpensourceJVMServersgetServerByVendor([String][18]name){if(name.equals("Apache")){returnnewTomcat();}elseif(name.equals("Eclipse")){returnnewJetty();}elseif(name.equals("RedHat")){returnnewWildFly();}else{返回空值;}}}OpenSourceJVMServer是一个100%的抽象类(也就是接口类),表示要实现什么,而不是如何实现:packageorg.opensource.demo.factory;公共接口OpensourceJVMServers{publicvoidstartServer();公共无效停止服务器();public[String][18]getName();}这是OpensourceJVMServers类的一个实现示例。当RedHat作为类型传递给工厂类时,将创建WildFly服务器:packageorg.opensource.demo.factory;publicclassWildFlyimplementsOpensourceJVMServers{publicvoidstartServer(){[System][19].out.println("正在启动WildFly服务器...");}publicvoidstopServer(){[System][19].out.println("正在关闭WildFly服务器...");}public[String][18]getName(){返回“WildFly”;}}观察者模式:订阅主题并获得相关更新的通知。最后,观察者模式就是观察者模式。与单例模式一样,很少有专业程序员直接实现观察者模式。然而,许多消息队列和数据服务的实现都借用了观察者模式的概念。观察者模式定义了对象之间一对多的依赖关系。当一个对象的状态发生变化时,所有依赖它的对象都会自动得到通知和更新。观察者模式:如果有更新,订阅主题/主题的客户端将得到通知。理解观察者模式最简单的方法是想象一个邮件列表,您可以在其中订阅任何主题,无论是开源、技术、名人、烹饪还是您感兴趣的任何其他主题。每个主题维护一个订阅者列表,相当于观察者模式中的观察者。当一个主题更新时,它的所有订阅者(观察者)都将收到有关更改的通知。订阅者可以随时取消订阅主题。如下图所示,客户端可以订阅不同的主题,并添加观察者以通知最新信息。因为观察者一直在监听主题,所以观察者会通知客户端发生的任何变化。观察者模式我们来看一下观察者模式的代码示例,从主题/主题类开始:packageorg.opensource.demo.observer;publicinterfaceTopic{publicvoidaddObserver([Observer][22]observer);publicvoiddeleteObserver([观察者][22]观察者);publicvoidnotifyObservers();}这段代码描述了一个接口,它为不同的主题实现定义的方法。注意观察者是如何添加、删除和通知的。这是一个主题的实例:packageorg.opensource.demo.observer;importjava.util.List;importjava.util.ArrayList;publicclassConferenceimplementsTopic{privateList
