前言 在软件开发的世界里,设计模式如同一本精妙的编码诗集,已经成为一种标准的编程实践。在Java编程中,设计模式很重要。 本人将制作一个关于Java设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源:Gitee点击跳转。在上一篇《Java设计模式(2)工厂模式》文章中,我们介绍了工厂模式。 本文是这个系列的第三篇章,我们将讲解一下建造者模式的实现方式、应用场景以及它的用途。 建造者模式 建造者模式是一种创建型设计模式,其主要目的是将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的对象 应用场景 当一个对象的构建过程较为复杂,包含多个组件或者步骤,而且需要根据不同的需求构建不同表示时 --------------"); Computer computer = new Build() .setCpu("AMD Ryzen 77800 X3D
抽象工厂模式定义 工厂方法模式中工厂只负责同类产品的生产。比如电视机工厂不应该生产汽车。 然而现实生活中有很多综合型的工厂,比如有些电视工厂不仅生产电视机,还会生产与之配套的机顶盒。 那么抽象工厂模式随之诞生,这种模式将考虑多种类型产品的生产。 我们总结下: 工厂方法模式只考虑成产同一等级级的产品 抽象方法模式考虑生产多等级的产品,可以说是工厂方法模式的升级版 如上图,小米音响和苹果音响为同一个产品。而小米手机和小米音响为同一产品族。 使用场景 那么什么情况下可以使用抽象工厂模式? 使用抽象工厂模式一般要满足以下条件。 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。 抽象工厂模式同工厂方法模式结构一样,需要抽象产品,抽象工厂,具体产品,具体工厂4部分组成。
上一篇推文写了单例设计模式,这篇文章介绍和工厂模式类似的建造者模式,实际开发中,要根据情况使用不同的设计模式 建造者模式 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理, 用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。 我们看一下代码:和前面写的工厂模式一样,一个Send接口,两个实现类MailSend和SmsSend。 new Builder(); builder.produceMailSend(10); builder.produceSmsSend(10) } } 总结 建造者模式将很多功能集成到一个类里 所以与工程模式的区别就是:工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象,多个部分。因此,是选择工厂模式还是建造者模式,依实际情况而定。
导言 为了说明抽象工厂模式引入的背景首先回忆起Python设计模式(2):工厂方法模式类图。从图中可以看到,在工厂方法模式中针对一组产品类构造了另外一组工厂类,并且工厂类与产品类有相同的结构。 假如现在有两组以上具有相同结构的产品类,是否还可以使用工厂方法模式呢?例如有3组产品,鞋(Shoes)、西装(Suit)和领带(Tie),如图所示,每类产品都分为男女两类。 这种方法有一个缺点,就是需要至少3个Creator层次类。这种办法是可行的,但是太麻烦。 解决方案2:以上3个层次类具有相同的结构,可以改造以上所述的工厂方法模式,使得只需要一个工厂层次类就可以担负起创建3组产品对象的责任。设计图如图所示。 ? 第二种解决方案就是将要讲述的抽象工厂模式(Abstract Factory Pattern),包含两个产品类的的抽象工厂模式设计类图如图所示。 ? 抽象工厂模式与工厂方法模式有相似的概念。
小谈设计模式(3)—策略模式 专栏介绍 主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。 策略模式 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,将每个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户端。 在客户端使用策略模式时,通常需要与环境类进行交互。 抽象策略(Strategy) 抽象策略类是策略模式的接口或抽象类,定义了具体策略类所必须实现的算法。 通过使用策略模式,可以将算法的定义和使用分离,提高代码的灵活性、可维护性和可扩展性。 核心思想 策略模式的核心思想是将算法的定义和使用分离。 然而,策略模式也会增加类的数量,增加客户端的复杂性,并且需要考虑策略的选择逻辑。在使用策略模式时,需要权衡其优点和缺点,选择合适的使用方式。
先回顾比较简单的办法 类式继承 一个简单的类 1 2 3 4 5 6 7 8 9 10 11 /* class Person */ function Person(name) { this.name return this.name; } var reader = new Person('memoryboxes'); reader.getName(); 好,下面定义一个它的子类 1 2 3 最后,为了简化类的声明,可以将这些工作封装在extend函数中: 1 2 3 4 5 6 function extend(subClass, superClass) { var F = function 但是这样还有个小缺点,声明 Author的时候,还要显式的调用一下Person.call(),下面这个版本进一步做了改进: 1 2 3 4 5 6 7 8 9 10 11 function extend superClass.prototype.contructor = superClass; } } 增加了一个superclass属性来直接访问基类,这样声明Author的时候可以这么写: 1 2 3
在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗。 Java设计模式-工厂模式(3)抽象工厂模式 一、前言 1)概述: 2)角色概述: 3)前文 二、代码实现 1)抽象产品及具体产品: 2)抽象工厂 及具体工厂 3)测试 4)优缺点: 5)使用场景: 三 、自言自语 一、前言 1)概述: 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用于产品族的构建。 3)前文 在这里再次上一篇文章中Java设计模式-工厂模式(2)工厂方法模式 中出现的问题再做一次扩展。 原问题是: 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。
模板方法模式 什么是模板方法模式? 模板方法模式的定义: 定义一个操作算法的框架,将一些步骤延迟到子类中,使得子类可以不改变一个算法结构,即可重新定义该算法的某些特定步骤。 ); } @Override public String getFlavor() { return "Apple"; } } 当看完上述示例后,很多小伙伴会表示惊讶,难道这就是模板方法模式 模板方法模式的优缺点 优点: 封装不可变部分,扩展可变部分 提取公共部分代码,便于维护 行为由父类控制,子类实现 缺点 抽象类定义了部分抽象方法,其实现由子类完成,子类执行的结果会影响父类的结果。
今天来学习一下设计模式中的中介者模式。 中介者模式可以理解为作为两者双方的调解者,负责传递消息给对方,如果可能还可以在中介类中对消息进行处理。我们常见的三层结构中也可以运用到该模式。 把理论说了那么多也没用,主要还是在从代码中理解出思想出来: namespace 中介者模式 { class Program { static void Main(string[] args) {
简介 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。 Override public void draw() { System.out.println("Inside Circle::draw() method."); } } 步骤 3 = shapeFactory.getShape("SQUARE"); //调用 Square 的 draw 方法 shape3.draw(); //获取颜色工厂
1.场景 适配器模式可能是开发人员用的最多的一种设计模式,做后台开发你可能每天都在使用。 适配器模式分为2种,类适配器(使用继承)和对象适配器(使用委托) 2.类适配器结构图 3.实现适配器模式 AlternatingCurrent相当于交流电,他有两个抽象方法,输出高电压和低电压。 下面就是使用委托实现适配器模式。 4.对象适配器结构图 同样AlternatingCurrent是提供输出电压。只不过自己是交流电不能供手机使用。 5.经常用到的适配器模式 在使用MyBtais-Plus的时候,sevice层的实现类,可以看到实现了service接口,同时继承了ServiceImpl,其中Service提供了基础的简单操作。 适配器模式的优缺点 优点: 1.如果我们不使用适配器而是直接调用具体的实现,首先一旦具体的实现发生改变,所以调用具体实现的地方都得改更,当使用适配器后只需要更改适配器,所有的调用者无需变动。
一、目的 解释器模式定义语法的表示以及该语法的对应解释。 二、实现 解释器模式使用组合模式来定义对象结构的内部表示。 例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。 如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。 逆波兰表达式的解释器一般是基于堆栈的。 3 2 -,表示3-2的运算,这里由于栈是先进后出,所以pop先取出2(在栈的左边),3(栈的的右边) this.left = left; this.right = right; } @ ("4 3 - 2 +")); } } 三、解释器模式的适用情况和应用案例 解释器模式适用于表达式被解释并转换为其内部表示的情况。
这一篇,我们学习本篇中最为复杂的三个设计模式,代理模式、中介者模式以及观察者模式。这三个模式很重要!! 七、代理模式 在代理设计模式中,一个对象充当另一个对象的接口。 ; }, 30000); 九、观察者模式 观察者(observer)模式广泛应用于客户端JavaScript编程中。所有的浏览器事件(鼠标悬停、按键等事件)是该模式的例子。 此外,该模式的另外一个别名是订阅/发布(subscriber/publisher)模式。 设计这种模式背后的主要动机是促进形成松散耦合。 小结 在本章中,我们学习了一些流行的设计模式以及这些模式在JavaScript中的实现: 单体模式:针对一个“类”仅创建一个对象。 工厂模式:根据字符串指定的类型在运行时创建对象的方法。 观察者模式:通过创建“可观察的”对象,当发生一个感兴趣的事件时可将该事件告知给所有观察者,从而形成松散耦合。 好了,到这里设计模式的部分就都结束了,设计模式的重要性就不再多说了。
1.设计模式 1.定义 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。 2.设计模式六大原则 1.设计模式六大原则(1):单一职责原则 即一个类只负责一项职责 2.设计模式六大原则(2):里氏替换原则 所有引用基类的地方必须能透明地使用其子类的对象 3.设计模式六大原则( 3.分类 1.创建型模式 主要目的:创建对象 共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 3.行为型模式 主要目的:对象的行为,对象能做什么 共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 工厂方法模式的优点和缺点 3.优点: 解决了简单工厂模式的违反开闭原则 4.缺点 如果需要增加一个具体产品类角色,需要添加这个类和对应的工厂类。代码量大。 3.__new__的使用 ? ?
这种模式能够在私有范围内定义所有的函数和变量,并返回一个匿名对象,它拥有指向私有函数的指针,该私有函数是希望展示为公有的方法。 greeting: publicVar, getName:publicGetName }; }(); myRevealingModule.setName("asd"); 该模式也可以用于展示更具体的命名方案的私有函数和属性 优点 该模式可以使脚本的语法更加一致,在模块尾部,也可以很容易指出那些函数和变量是公开的,改善了可读性。 3. 缺点 如果一个私有函数引用另一个公有函数,在需要打补丁时,公有函数是不能被覆盖的。 这是因为私有函数将继续引用私有实现,该模式不适用于公有成员,仅适用于函数。
接着上一篇《JavaScript设计模式第2篇:工厂模式》,今天我们来看工厂模式的最后一种:抽象工厂。 抽象工厂模式,官方定义,提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 总结 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 抽象工厂模式又称为Kit模式,属于对象创建型模式 抽象工厂模式包含 4 种角色: 抽象工厂、具体工厂、抽象产品、具体产品 抽象工厂用于声明生成抽象产品的方法 具体工厂实现了抽象工厂声明的生成抽象产品的方法 ,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构 抽象工厂模式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类创建一个产品族中的多个对象
从而引出装饰模式 装饰模式是动态的给对象增加一些属性和职责 类结构如下 ? 这样,就可以实现对人对象的动态装载,不过,这个例子举得感觉不是很好,没有列出装饰模式的精髓。
它是一种类行为型模式。 该模式的主要优点如下 它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。 该模式的主要缺点如下 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度。 例如,去银行办理业务一般要经过以下4个步骤: 1:取号、 2:排队、 3:办理具体业务、 4:对银行工作人员进行评分 其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是第 3步骤”办理具体业务”却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。 对于Template Method模板方法模式调用的虚函数建议设置为protected,只能子类访问重写.
该模式能够在私有范围内简单定义所有的函数和变量,并返回一个匿名对象, 它拥有指向私有函数的指针,该函数是他希望展示为公有的方法。 publicvar, getName: publicGetName }; }(); myRevealingModule.setName("Paul Kinlan"); </script> 优点: 该模式很容易之处哪些函数和变量可被公开访问 因为私有函数将继续引用私有实现,该模式并不适用于公有成员,只使用函数。
作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN学院、蓝桥云课认证讲师。 主打方向:Vue、SpringBoot、微信小程序 本文讲解了 Java 设计模式中的抽象工厂模式,并给出了样例代码,抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口 一、什么是抽象工厂模式 抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定其具体类。 抽象工厂模式适用于以下 3 个场景,请同学们认真学习。 需要创建一系列相互关联或相互依赖的产品对象。 需要在运行时动态决定创建哪种具体产品。 需要隐藏具体产品的实现细节,只对外提供抽象接口。 你认为抽象工厂模式在哪些场景下使用得最好? ---- 五、总结 本文讲解了 Java 设计模式中的抽象工厂模式,并给出了样例代码,在下一篇博客中,将讲解 Java 原型模式。