---
title: "工厂模式"
author: "Perrin Yong"
author_profile: https://www.pystone.net/profile/
published_by: "Perrin Yong"
canonical: https://www.pystone.net/notes/factory-pattern/
type: note
content_role: unspecified
visibility: public
id_stability: rename-stable
source_path: "10-计算机、信息技术与工程/03-软件工程与质量保障/软件体系结构与设计模式/工厂模式.md"
content_hash: 8edadb4eb7a5401da271315035c327dc2a50c75e7ad5ad3f4aab1e2745e865fc
knowledge_version: 224c990773de.5fa8af6e39fa
site_commit: 224c990773de166d23a886306577dd90379529ce
notes_commit: 5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a
---
# 工厂模式
> 创建时间：2020/5/19 11:41

## 工厂模式

## 概念

### 作用：

创建者和调用者分离

### 分类

  * 简单工厂（静态工厂）模式：用来生产同一等级结构中的任意产品（对于增加新的产品，需要修改已有代码)

  * 工厂方法模式：用来生产同一等级结构中的固定产品（支持增加任意产品）

  * 抽象工厂模式： **围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。**

### 原则

  * 开闭原则：一个软件的实体应当对扩展开放，对修改关闭

  * 依赖倒置原则：要针对接口编程，不针对实现编程

  * 迪米特法则(Law of Demeter)：只与你直接的朋友通信，而避免和陌生人通信
又叫作最少知识原则（Least Knowledge Principle,LKP）：一个类对于其他类知道的越少越好

### 核心本质

  * 实例化对象不使用new，用工厂方法代替

  * 将选择实现类，创建对象统一管理和控制。从而将调用者跟我们的实现类解耦

### 对比

结构复杂度：simple
代码复杂度：simple
编程复杂度：simple
管理上的复杂度：simple

根据设计原则：Factory Method
根据实际业务：simple

## 抽象工厂模式

### 定义

提供了创建一系列相关或者相互依赖对象的接口，无需指定他们具体的类

![Alt text](/media/8e351b8bc7602eac5500.png)

### 适用场景

  * 客户端（应用层）不依赖于产品类实例如何被创建、实现等细节

  * 强调一系列相关的产品对象（属于同一产品族）一起使用创建对象需要大量的重复代码

  * 提供一个产品类的库，所有的产品以同样的接口出现，从而使得客户端不依赖于具体的实现

### 相关概念

产品族
产品等级

### 优点

  * 具体产品在应用层的代码隔离，无需关心创建细节

  * 将一个系列的产品统一到一起创建

### 缺点

  * 规定了所有可能被创建的产品集合，产品族中扩展新的产品困难

  * 增加了系统的抽象性和理解难度
