首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏藏经阁

    【GoF 23】篇3抽象工厂

    什么是抽象工厂? 提供一个创建一系列相关或互相依赖的对象接口,而无需指定它们的具体类。 抽象工厂是一个超级工厂,是其他工厂的工厂,或将简单工厂进一步抽象。 这里,我们就可以将科技公司可以生产的产品全部在一个接口中枚举出来,这个接口就可以看作一个抽象工厂。而小米、华为、联想这些公司就是普通工厂。抽象工厂将普通工厂可以生产的产品进行抽象出来。 代码示例 定义普通工厂的抽象工厂 // 抽象工厂,抽象方法为科技公司可以生产的产品 public interface ProductFactory { // 可以生产手机,产品簇 PhoneProduct // 小米工厂要实现抽象工厂,抽象工厂就是将工厂可以做的事情抽象出来,具体行为由子工厂去定义 // 其实这里就是一个简单工厂,所以抽象工厂就是对简单工厂的抽象 public class XiaoMiFactory new XiaoMiFactory(); xiaoMiFactory.phoneProduct();//创建手机的实例 xiaoMiFactory.xiaoMiComputer()//创建电脑的实例 3.

    28020编辑于 2023-03-12
  • 来自专栏Python机器学习算法说书人

    Python设计模式(3):抽象工厂模式

    例如有3组产品,鞋(Shoes)、西装(Suit)和领带(Tie),如图所示,每类产品都分为男女两类。问题:此时是否还可以使用以上的工厂方法模式?如果回答为是,怎样应用工厂方法模式? ? 这种方法有一个缺点,就是需要至少3个Creator层次类。这种办法是可行的,但是太麻烦。 解决方案2:以上3个层次类具有相同的结构,可以改造以上所述的工厂方法模式,使得只需要一个工厂层次类就可以担负起创建3组产品对象的责任。设计图如图所示。 ? 第二种解决方案就是将要讲述的抽象工厂模式(Abstract Factory Pattern),包含两个产品类的的抽象工厂模式设计类图如图所示。 ? 抽象工厂模式与工厂方法模式有相似的概念。 抽象工厂模式与工厂模式一样是层次类的结构,但是在这里它不仅仅负责创建一个产品类的对象,而是一族产品类对象。在程序中,它可以是接口或者抽象类。

    1.5K20发布于 2019-07-26
  • 来自专栏Lvshen的技术小屋

    设计模式3抽象工厂模式

    那么抽象工厂模式随之诞生,这种模式将考虑多种类型产品的生产。 使用场景 那么什么情况下可以使用抽象工厂模式? 使用抽象工厂模式一般要满足以下条件。 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。 抽象工厂模式同工厂方法模式结构一样,需要抽象产品,抽象工厂,具体产品,具体工厂4部分组成。 我们再总结下什么情况下会使用抽象工厂模式: 系统中有多个产品族,但每次只使用其中的某一族产品。 于是我们可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。 ”

    36710编辑于 2022-05-05
  • 来自专栏Java EE 企业级开发工作日志

    Java 设计模式 Day3 之面向抽象原则:什么是面向抽象编程?面向抽象编程如何应用?

    被实现类 3.4、面向抽象编程的具体实现 四、面向抽象编程的优势 总结 前言 面向抽象原则是面向对象四大基本原则的第一条,其重要性不言而喻,面向抽象原则分为抽象类、接口以及面向抽象编程,在之前的内容中我们详细介绍了抽象类与接口 一、什么是面向抽象编程? 面向抽象编程就是在设计一个类时,不让该类面向具体的类,而是面向抽象类或接口,即所设计的类中的重要数据是抽象类或接口声明的变量,而不是具体类声明的变量。 三、采用面向抽象编程的类设计 3.1、设计一个抽象类/接口 如果我们采用面向抽象编程重新进行设计,首先需要设计一个抽象类用来获取柱体底面积,该抽象类(或接口)我们定义为 Geometry(),我们在其中定义一个 public static void main(String[] args) { Pillar pillar; Geometry bottom; bottom = new Rectangle(2, 3) ;// 抽象类的实例作为Rectangle类的上转型对象 pillar = new Pillar(bottom, 3); System.out.println("矩形底柱体体积为: " + pillar.getVolume

    1K20编辑于 2022-04-13
  • 来自专栏编程学习之路

    抽象类与接口(3)(接口部分)

    } } public static void main(String[] args) { Student[] students = new Student[3] (一般重写为如上代码格式) ​​​​​​​ 3.异常处理:在调用clone()方法时,可能会抛出CloneNotSupportedException异常。 抽象类和接口的区别 ❤️❤️抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别(重要!!! 常见面试题). 核心区别: 1.抽象类中可以包含方法和成员变量, 这样的方法和成员变量可以被子类直接使用(不必重写) 2.接口中只能有抽象方法,default或static修饰的方法,。 子类必须重写所有的抽象方法. 再次提醒: 抽象类存在的意义是为了让编译器更好的校验, 像 Animal 这样的类我们并不会直接使用, 而是使用它的子类.

    24810编辑于 2024-04-08
  • 来自专栏关于Java学习@宁在春

    Java设计模式-工厂模式(3抽象工厂模式

    Java设计模式-工厂模式(3抽象工厂模式 一、前言 1)概述: 2)角色概述: 3)前文 二、代码实现 1)抽象产品及具体产品: 2)抽象工厂 及具体工厂 3)测试 4)优缺点: 5)使用场景: 三 抽象工厂是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂是指当有多个抽象角色时使用的一种工厂模式。 具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。 抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。 3)前文 在这里再次上一篇文章中Java设计模式-工厂模式(2)工厂方法模式 中出现的问题再做一次扩展。 原问题是: 需求:设计一个咖啡店点餐系统。 LatteCoffee(); } @Override public Dessert createDessert() { return new Tiramisu(); } } 3

    46130编辑于 2022-10-31
  • 来自专栏前端进阶之路

    JavaScript设计模式第3篇:抽象工厂模式

    产品等级结构: 产品等级结构就是产品的继承结构,比如一个抽象类是电视机,那么其子类会有海尔电视,TCL电视,小米电视等等,那么抽象电视机和具体品牌的电视机之间就构成了一个产品等级结构,抽象电视机是父类, 抽象工厂模式包含如下 4 种角色: 抽象工厂 具体工厂 抽象产品 具体产品 概念还是太生涩了,下面看例子。 通过抽象工厂我们解决了什么问题呢? 抽象工厂模式又称为Kit模式,属于对象创建型模式 抽象工厂模式包含 4 种角色: 抽象工厂、具体工厂、抽象产品、具体产品 抽象工厂用于声明生成抽象产品的方法 具体工厂实现了抽象工厂声明的生成抽象产品的方法 ,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中 抽象产品为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法 具体产品定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法

    50110发布于 2019-12-16
  • 来自专栏Jasper小笔记

    3分钟学设计模式(创建型)3抽象工厂模式

    本篇内容关于抽象工厂模式。 ——关于工厂方法模式看这篇 《3分钟学设计模式(创建型):2、工厂方法模式》 这里画一个抽象工厂大概的UML图: 就图的区别而言,工厂方法模式只提供一个创建实例的方法。 工厂方法模式只提供一个抽象的工厂方法,如果要和抽象工厂创建对象的范围一样的话,那么这个唯一的工厂方法的返回类型就要相对来说大一层。 对于抽象方法来说是直接指定了需要创建的各个产品类型。这样这个类型既不是具体也不至于太抽象,便于使用,一套产品各自有各自的使用点。 他们都是完成了解藕抽象的目的,可以说整个工厂模式是面向抽象编程的一个最佳实践。

    38510发布于 2021-10-08
  • 来自专栏撸码那些事

    抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象

    不完整的抽象 抽象未支持所有互补或相关的方法时,将导致这种坏味。 为什么要有完整的抽象? 一种重要的抽象实现手法是创建内聚而完整的抽象抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性。 多方面抽象 抽象被赋予不止一项职责时,将导致这种坏味。 为什么不可以有多方面抽象? 单一职责原则指出,抽象必须承担单一而明确的职责,且必须完全封装该职责。 未用的抽象 创建的抽象未用(未被直接使用或继承)时,将导致这种坏味。有以下两种表现形式: 未引用的抽象:未用的具体类 鳏寡抽象:没有任何派生抽象的接口/抽象类 为什么不可以有未用的抽象? 重复的抽象 两个抽象的名称、实现或两者相同时,将导致这种坏味。 名称相同 两个不同的抽象重名将影响可理解性。 重构建议 对于名称相同的重复抽象,可以将其中一个抽象改为不同的名称。 对于实现相同的重复抽象,如果实现完全相同,可将其中一个抽象删除。

    87120发布于 2018-06-21
  • 来自专栏韩曙亮的移动开发专栏

    【Kotlin】抽象类 ( 声明 | 抽象类成员 | 抽象类继承 | 抽象方法覆盖 | 抽象方法实现 )

    抽象类总结 II . 抽象类声明 III . 抽象类中的 ( 正常 / 抽象 ) 的 ( 成员 / 方法 ) IV . 抽象类继承 V . 抽象方法的覆盖 VI . 抽象方法的实现 I . 抽象类总结 ---- 抽象类总结 : ① 声明 : 抽象类中使用 abstract 声明 ; ② 成员 : 抽象类中既可以定义正常属性和方法 , 又可以定义抽象的属性和方法 ; ③ 继承 : 抽象类可以继承抽象类 , 抽象类也可以继承正常类 , 正常类可以继承抽象类 ; ④ 重写 : 抽象类中可以使用抽象方法重写正常方法 , 也可以进行正常的方法重写 ; ⑤ 特征 : 抽象方法只能定义在抽象类中 , 正常类中不能有抽象方法 } } 3 . 该正常类必须使用 open 修饰 abstract class Son : Father() { override abstract fun action() } 3 .

    1.9K40编辑于 2023-03-27
  • 来自专栏撸码那些事

    抽象那些事】缺失抽象

    这就是抽象。对于软件工程师来说,抽象能力是最重要的能力之一,也恰恰是最难得的能力之一。 应用抽象原则的实现手法 提供清晰的概念边界和唯一身份 每个抽象都必须有清晰而明确的概念边界,还必须有身份。 如果只提供方法的一部分,抽象既不内聚也不完整。 赋予单一而重要的职责 确保每个抽象都分配单一而重要的职责。 单一:每个抽象都应该只负责一件或一类事情。 重要:抽象不能太鸡肋。 违反抽象原则导致的坏味 我们这篇博客主要讲解分析缺失抽象坏味,对于其它抽象坏味将在后面的博客讲解分析。 缺失抽象 使用一系列数据或编码字符串,而不创建类或接口时,将引发这种坏味。 通常,由于缺失抽象,相关的数据和行为将会分散在其它抽象中,这将会导致两个问题l: 可能会向其它抽象暴露实现细节,违反封装原则 数据和相关的行为分散在不同的抽象中,可能导致实体之间高度耦合,结果是代码脆弱且难以重用 因为在创建抽象前,一定要根据应用抽象具体情况分析,再决定是否要创建抽象

    1.2K150发布于 2018-05-19
  • 来自专栏撸码那些事

    抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重复的抽象

    不完整的抽象 抽象未支持所有互补或相关的方法时,将导致这种坏味。 为什么要有完整的抽象? 一种重要的抽象实现手法是创建内聚而完整的抽象抽象未支持相关的方法时,可能会影响抽象的内聚性和完整性。 多方面抽象 抽象被赋予不止一项职责时,将导致这种坏味。 为什么不可以有多方面抽象? 单一职责原则指出,抽象必须承担单一而明确的职责,且必须完全封装该职责。 使用提取类重构多方面抽象 未用的抽象 创建的抽象未用(未被直接使用或继承)时,将导致这种坏味。 有以下两种表现形式: 未引用的抽象:未用的具体类 鳏寡抽象:没有任何派生抽象的接口/抽象类 为什么不可以有未用的抽象? 设计中的抽象未被使用,就没有发挥任何作用,因此违反了抽象原则。 重构建议 对于名称相同的重复抽象,可以将其中一个抽象改为不同的名称。 对于实现相同的重复抽象,如果实现完全相同,可将其中一个抽象删除。

    61890发布于 2018-05-23
  • 来自专栏dylanliu

    抽象

    这是抽象抽象,即如何界定本质?这个方法需要我们在实践中抽象出自己的方法论,才能不被纷繁事物晃花了眼。 抽象层次 抽象层次包含两个概念:1)复杂系统需要分层,每层关注不同的粒度,合而为整体。 2)在某一抽象层次上,抽象出的功能、概念应处于同一抽象层次,而不应混合不同抽象层次的功能、概念。 1) 分层 分层有几个目的:1⃣ 易于复用。 2⃣减少信息量。 3⃣ 概念化 1⃣ 易于复用 事物粒度越小,则越易复用,粒度越大,则功能越完备。一颗螺钉可以用在很多需要衔接的地方,一台发动机就只能呆在车的前盖下。 3⃣ 概念化 当我们抽象出某一层次之后,就可以对它进行命名。命名也就是定义的过程,让我们更加理解当前层次的本质。 2) 同一抽象层次 同一抽象层次在实践中是很重要的。编码时经常看到不同的人将不同抽象层次的代码放到一个接口中,这就将抽象的威力大大降低了。

    1.1K50发布于 2019-07-01
  • 来自专栏撸码那些事

    抽象那些事】缺失抽象

    这就是抽象。对于软件工程师来说,抽象能力是最重要的能力之一,也恰恰是最难得的能力之一。 应用抽象原则的实现手法 提供清晰的概念边界和唯一身份 每个抽象都必须有清晰而明确的概念边界,还必须有身份。 如果只提供方法的一部分,抽象既不内聚也不完整。 赋予单一而重要的职责 确保每个抽象都分配单一而重要的职责。 单一:每个抽象都应该只负责一件或一类事情。 重要:抽象不能太鸡肋。 违反抽象原则导致的坏味 我们这篇博客主要讲解分析缺失抽象坏味,对于其它抽象坏味将在后面的博客讲解分析。 缺失抽象 使用一系列数据或编码字符串,而不创建类或接口时,将引发这种坏味。 通常,由于缺失抽象,相关的数据和行为将会分散在其它抽象中,这将会导致两个问题l: 可能会向其它抽象暴露实现细节,违反封装原则 数据和相关的行为分散在不同的抽象中,可能导致实体之间高度耦合,结果是代码脆弱且难以重用 因为在创建抽象前,一定要根据应用抽象具体情况分析,再决定是否要创建抽象。 参考:《软件设计重构》

    74130发布于 2018-06-21
  • 来自专栏swag code

    抽象类与抽象方法

    在我们抽象实例对象的时候,有这样一种情况,往上层抽象时就会发现很难描述对象的属性和行为,比如“形状” ,其方法计算面积怎么计算? 好吧,形状确实是有面积的,但是又无法描述其实现方式,这种包含类我们可以抽象出一个抽象类。 抽象类由于其有可能有无法实现的方法(抽象方法),所以不能被实例化。 抽象类的特征: 1)使用abstract关键字修饰的类称为抽象类 2)抽象类不能实例化对象,原因是抽象方法无法被调用 3)有抽象方法的类肯定是抽象类,但是抽象类中不是必须有抽象方法 如果许多类都有相同的方法 不是具体的动物相信你肯定无法回答,这样我们就需要创建抽象的动物类 public abstract class Animal { }  抽象动物类 1.抽象类不能直接实例化,必须通过子类 abstract void eat();  抽象吃的方法(行为) 2.抽象方法只需声明,不需要实现 ?

    68730发布于 2018-08-20
  • 来自专栏麒思妙想

    抽象语法树为什么抽象

    从具体到抽象 Abstract Syntax Tree抽象语法树(通常被简写成AST)实际上只是一个解析树(parse tree)的一个精简版本。 AST名字中抽象一词的由来。 ,那我们可以根据前面提到的文法规则公式,用形式语言把这些规则简写出来: // 每条产生式前面的序号只为了更好的在下文引用,并不是产生式的一部分 1) E -> E + E 2) E -> E * E 3) 将操作符压进内部节点 继续把冗余的层修剪掉,我们可以得到一颗AST树 一颗抽象语法树 我们已经自己压缩了一棵解析树,通过上面几个步骤的精简,可以总结一些解析树和抽象语法树的不同之处: AST不含有语法细节 有了抽象语法树,我们基于它可以建立清晰的代码描述,非常有利于后续阶段的修改、变换。

    2.1K30发布于 2020-08-17
  • 来自专栏nginx

    【Java设计模式 - 创建型模式3抽象工厂模式

    简介 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。 用 OOP 的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服又包括具体的上衣(某一具体产品),裤子(某一具体产品),这些具体的上衣其实也都是上衣(抽象产品),具体的裤子也都是裤子 (另一个抽象产品)。 Override public void draw() { System.out.println("Inside Circle::draw() method."); } } 步骤 3 = shapeFactory.getShape("SQUARE"); //调用 Square 的 draw 方法 shape3.draw(); //获取颜色工厂

    22810编辑于 2025-11-13
  • 来自专栏撸码那些事

    抽象那些事】 命令式抽象

    命令式抽象 这种坏味是由操作转换为类引起的,表现为类中只定义了一个方法,有时候类名和方法名相同。这种坏味还常常表现为方法操作的数据位于另一个类中。 为什么不能命令式抽象? 面向对象的基本原则是,识别真实世界中的事物,并使用抽象来表示它们。在解决方案域中,必须将问题域的对象表示出来,为此可采用映射域实体这一实现手法,抽象的每个类都必须封装数据和相关的方法。 只包含一个操作的类根本不是抽象,其操作的数据位于其它地方时尤其如此。这样很多操作相同数据的方法位于不同的类中,减低了类的内聚性,违反了封装和模块化原则。 命令式抽象潜在的原因 过程式思维 数据和操作这些数据的方法被封装在不同类中,典型的过程式思维。 ”坏味的类中的方法都移到Report类中,那么Report类就变成了一个恰当的抽象,同时消除了“命令式抽象”坏味。

    94280发布于 2018-05-20
  • 来自专栏撸码那些事

    抽象那些事】命令式抽象

    命令式抽象 这种坏味是由操作转换为类引起的,表现为类中只定义了一个方法,有时候类名和方法名相同。这种坏味还常常表现为方法操作的数据位于另一个类中。 为什么不能命令式抽象? 面向对象的基本原则是,识别真实世界中的事物,并使用抽象来表示它们。在解决方案域中,必须将问题域的对象表示出来,为此可采用映射域实体这一实现手法,抽象的每个类都必须封装数据和相关的方法。 只包含一个操作的类根本不是抽象,其操作的数据位于其它地方时尤其如此。这样很多操作相同数据的方法位于不同的类中,减低了类的内聚性,违反了封装和模块化原则。 命令式抽象潜在的原因 过程式思维 数据和操作这些数据的方法被封装在不同类中,典型的过程式思维。 ”坏味的类中的方法都移到Report类中,那么Report类就变成了一个恰当的抽象,同时消除了“命令式抽象”坏味。

    48230发布于 2018-06-21
  • 来自专栏全栈开发那些事

    抽象类和抽象方法

    java中的抽象类与抽象方法 1、设计理念 2、抽象方法 3抽象类 3.1 抽象类与普通类的区别 3.2 抽象类案例 1、设计理念   父类要体现所有子类的共同特征,在设计某些方法(行为特征或功能) 另外,只允许在抽象类和接口中声明抽象方法,否则将发生编译错误。 3抽象类   Java规定如果一个类中包含抽象方法,则该类必须设计为抽象类。 如果不声明为抽象类,则此类就可以实例化,但是得到的对象对抽象方法的调用是无意义的,因为没有任何方法体。 3.1 抽象类与普通类的区别 抽象类不能直接实例化,即不能直接创建抽象类的对象。 子类继承抽象类后,如果子类不再是抽象类,那么子类必须重写抽象类的所有抽象方法,否则编译报错。 =new Rectangle(2,4); arr[1]=new Rectangle(1,2); arr[2]=new Circle(1.5); arr[3]

    93820编辑于 2023-02-25
领券