设计模式-工厂方法模式

网站链接:
工厂方法设计模式 (refactoringguru.cn)

简介

工厂方法模式 她是一种创建型设计模式,其在父类中提供一种船舰对象的方法,允许子类决定实例化对象的类型。

简单工厂

‘简单工厂模式’,也就是说,到底要实例化谁,将来会不会增加实例化的对象,比如增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂



简单工厂就是在需要的时候, 创建对应的类. 每个类都相互独立,互不影响, 如果增加代码,不会编译之前的类, 减少编译时间.

工厂方法模式结构

不同的类实现相同的动作,例如运输等

  1. 产品 (Product) 将会对接口进行声明。 对于所有由创建者及其子类构建的对象, 这些接口都是通用的。

  2. 具体产品 (Concrete Products) 是产品接口的不同实现。

  3. 创建者 (Creator) 类声明返回产品对象的工厂方法。 该方法的返回对象类型必须与产品接口相匹配。

    你可以将工厂方法声明为抽象方法, 强制要求每个子类以不同方式实现该方法。 或者, 你也可以在基础工厂方法中返回默认产品类型。

    注意, 尽管它的名字是创建者, 但它最主要的职责并不是创建产品。 一般来说, 创建者类包含一些与产品相关的核心业务逻辑。 工厂方法将这些逻辑处理从具体产品类中分离出来。 打个比方, 大型软件开发公司拥有程序员培训部门。 但是, 这些公司的主要工作还是编写代码, 而非生产程序员。

  4. 具体创建者 (Concrete Creators) 将会重写基础工厂方法, 使其返回不同类型的产品

    注意, 并不一定每次调用工厂方法都会创建新的实例。 工厂方法也可以返回缓存、 对象池或其他来源的已有对象

伪代码


基础对话框类使用不同的 UI 组件渲染窗口。 在不同的操作系统下, 这些组件外观或许略有不同, 但其功能保持一致。 Windows 系统中的按钮在 Linux 系统中仍然是按钮。

如果使用工厂方法, 就不需要为每种操作系统重写对话框逻辑。 如果我们声明了一个在基本对话框类中生成按钮的工厂方法, 那么我们就可以创建一个对话框子类, 并使其通过工厂方法返回 Windows 样式按钮。 子类将继承对话框基础类的大部分代码, 同时在屏幕上根据 Windows 样式渲染按钮。

如需该模式正常工作, 基础对话框类必须使用抽象按钮 (例如基类或接口), 以便将其扩展为具体按钮。 这样一来, 无论对话框中使用何种类型的按钮, 其代码都可以正常工作。

你可以使用此方法开发其他 UI 组件。 不过, 每向对话框中添加一个新的工厂方法, 你就离抽象工厂模式更近一步。

简单工厂和工厂模式的区别

1. 简单工厂设计模式(Simple Factory Design Pattern):

定义: 简单工厂模式是一种创建型设计模式,它提供了一个工厂类,该工厂类根据传入的参数或条件来实例化并返回不同类型的对象。
结构: 简单工厂模式通常由三个主要部分组成:工厂类(Factory Class)、产品类(Product Class)和客户端(Client)。客户端通过工厂类来创建产品对象,而不直接实例化产品类。
示例: 一个简单工厂模式的示例是创建不同类型的汽车对象,工厂根据传入的参数(如汽车型号)来创建相应类型的汽车对象。
2. 工厂方法设计模式(Factory Method Design Pattern):

定义: 工厂方法模式是一种创建型设计模式,它将对象的创建委托给具体的工厂类,每个具体工厂类负责创建特定类型的对象。
结构: 工厂方法模式包括抽象工厂接口(Abstract Factory Interface)、具体工厂类(Concrete Factory Class)、抽象产品接口(Abstract Product Interface)和具体产品类(Concrete Product Class)。
示例: 一个工厂方法模式的示例是创建不同类型的文件读取器对象。抽象工厂接口定义了创建文件读取器的方法,具体工厂类实现了这个接口并负责创建特定类型的文件读取器。
主要区别:

复杂性: 简单工厂模式更简单,通常只有一个工厂类,而工厂方法模式更灵活,可以有多个具体工厂类。

责任分配: 在简单工厂模式中,工厂类负责创建对象的具体类型,而在工厂方法模式中,具体工厂类负责创建特定类型的对象。

扩展性: 工厂方法模式更容易扩展,因为可以轻松地添加新的具体工厂类来创建新类型的对象,而不需要修改现有的代码。在简单工厂模式中,要添加新类型的对象通常需要修改工厂类的代码,这违反了开放-封闭原则。

灵活性: 工厂方法模式提供了更大的灵活性,因为它允许每个具体工厂类自行决定如何创建对象,而简单工厂模式通常在一个工厂类中硬编码了创建对象的逻辑。

选择简单工厂模式还是工厂方法模式取决于项目的需求和设计目标。简单工厂模式通常用于创建一组相关对象,而工厂方法模式更适用于创建不同种类的对象,且需要更高的扩展性。

UML类图如何看

看懂UML类图和时序图 — Graphic Design Patterns (design-patterns.readthedocs.io)

- 车的类图结构为abstract,表示车是一个抽象类;
- 它有两个继承类:小汽车和自行车;它们之间的关系为实现关系,使用带空心箭头的虚线表示;
- 小汽车为与SUV之间也是继承关系,它们之间的关系为泛化关系,使用带空心箭头的实线表示;
- 小汽车与发动机之间是组合关系,使用带实心箭头的实线表示;
- 学生与班级之间是聚合关系,使用带空心箭头的实线表示;
- 学生与身份证之间为关联关系,使用一根实线表示;
- 学生上学需要用到自行车,与自行车是一种依赖关系,使用带箭头的虚线表示;

首先你看那个‘动物’矩形框,它就代表一个类(Class)。类图分三层,第一层显示类的名称,如果是抽象类,则就用斜体显示。第二层是类的特性,通常就是字段和属性。第三层是类的操作,通常是方法或行为。注意前面的符号,‘+’表示public,‘-’表示private,‘#’表示protected。”

接口:

‘飞翔’,它表示一个接口图,与类图的区别主要是顶端有interface显示。第一行是接口名称,第二行是接口方法。接口还有另一种表示方法,俗称棒棒糖表示法,比如图中的唐老鸭类就是实现了‘讲人话’的接口.

类和类之间的关系: 继承的关系,继承关系用空心三角形+实线来表示

聚合: 我们再来看大雁与雁群这两个类,大雁是群居动物,每只大雁都是属于一个雁群,一个雁群可以有多只大雁。所以它们之间就满足聚合(Aggregation)关系。聚合表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分 [DPE](DPE表示此句摘自《设计模式》(第2版),详细摘要说明见附录二)。聚合关系用空心的菱形+实线箭头来表示。


合成(Composition,也有翻译成‘组合’的)是一种强的‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样 [DPE]。在这里鸟和其翅膀就是合成(组合)关系,因为它们是部分和整体的关系,并且翅膀和鸟的生命周期是相同的。合成关系用实心的菱形+实线箭头来表示。另外,你会注意到合成关系的连线两端还有一个数字‘1’和数字‘2’,这被称为基数。表明这一端的类可以有几个实例,很显然,一个鸟应该有两只翅膀。如果一个类可能有无数个实例,则就用‘n’来表示。关联关系、聚合关系也可以有基数的。

依赖


设计模式-工厂方法模式
https://leiqi.top/2023-09-03-c58ee0dac51b.html
作者
Lei Qi
发布于
2023年9月3日
许可协议