简单工厂模式
定义
严格意义简单工厂模式并非设计模式,比较像一种编码习惯。由于经常被使用,因此被大多数程序研发人员误认为是“工厂模式”。
类图
classDiagram PizzaStore --|> SimpleFactory SimpleFactory --|>Pizza Pizza <|.. CheesePizza Pizza <|.. VeggiePizza Pizza : +String name Pizza : +String area Pizza : +准备() Pizza : +烘焙() Pizza : +装饰() Pizza : +打包() class PizzaStore{ SimpleFactory factory +Pizza OrderPizza() } class SimpleFactory{ +Pizza createPizza() } class CheesePizza{ } class VeggiePizza{ }
解释
适用于小作坊,包含多个具体产品,
SimpleFactory 就是生产产品的工厂,他应该是我们唯一用到具体Pizza类(CheesePizza、VeggiePizza)的地方。
PizzaStore 是工厂的客户,通过SimpleFactory 工厂取得Pizza实例。
工厂方法模式
定义
定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个,工厂方法让类把实例化推迟到子类。类图
classDiagram PizzaStore <|.. NYPizzaStore PizzaStore <|.. ChinaPizzaStore PizzaStore --|> Pizza Pizza <|.. NYPizza Pizza <|.. ChinaPizza NYPizzaStore --|> NYPizza ChinaPizzaStore --|>ChinaPizza <<abstract>> Pizza Pizza : +String name Pizza : +String area Pizza : +准备() Pizza : +烘焙() Pizza : +装饰() Pizza : +打包() class PizzaStore{ +final OrderPizza() +Pizza createPizza() } class NYPizzaStore{ +Pizza createPizza() } class ChinaPizzaStore{ +Pizza createPizza() } class NYPizza{ } class ChinaPizza{ }
```
- 解释
满足于连锁店,多个具体产品要适应多种地域特色,比如纽约的具体产品和中国的具体产品是味道是不一样的。
抽象创建者(Creator)类 PizzaStore 定义了一个抽象的工厂方法 createPizza,让子类(具体创建者)实现此方法制造自己的产品,他通常包含依赖于抽象产品的代码,而这些抽象产品由子类制造,他并不需要真的知道 在制造哪种具体产品。
工厂生产产品,对于创建者 PizzaStore来说,产品就是Pizza,他的子类是具体的产品,所有实际生产出来的Pizza 都是他的子类。 - 优缺点
解决了产品维度新增问题(新增具体产品的问题),只需要创建Pizza子类 ,并创建PizzaStore(创建者)的子类即可。 - 引申
- 依赖倒置原则(要依赖抽象,不要依赖具体类)
变量不可以持有具体类的引用
不要让类派生自具体类
不要覆盖基类中已实现的方法
- 依赖倒置原则(要依赖抽象,不要依赖具体类)
抽象工厂模式
定义
提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。类图
classDiagram PizzaStore <|.. NYPizzaStore PizzaStore <|.. ChinaPizzaStore PizzaStore --|> Pizza Pizza <|.. ChinaPizza Pizza <|.. NYPizza NYPizzaStore --|> NYPizza ChinaPizzaStore --|>ChinaPizza <<abstract>> Pizza Pizza : +String name Pizza : +String area Pizza : +准备材料() Pizza : +烘焙() Pizza : +装饰() Pizza : +打包() class PizzaStore{ <<abstract>> +final OrderPizza() +Pizza createPizza() } class NYPizzaStore{ +Pizza createPizza() } class ChinaPizzaStore{ +Pizza createPizza() } class NYPizza{ } class ChinaPizza{ } NYPizzaIngredientFactory <|-- NYPizzaStore class PizzaIngredientFactory{ <<interface>> +创建蘸酱 +创建面饼 +创建蔬菜 +创建肉 +创建芝士 } PizzaIngredientFactory <|.. NYPizzaIngredientFactory class NYPizzaIngredientFactory{ +创建蘸酱 +创建面饼 +创建蔬菜 +创建肉 +创建芝士 } PizzaIngredientFactory <|.. ChinaPizzaIngredientFactory class ChinaPizzaIngredientFactory{ +创建蘸酱 +创建面饼 +创建蔬菜 +创建肉 +创建芝士 } 蘸酱 <|.. 北京蘸酱 蘸酱 <|.. 纽约蘸酱 PizzaIngredientFactory --|>蘸酱 NYPizzaIngredientFactory --|>纽约蘸酱 ChinaPizzaIngredientFactory --|>北京蘸酱 NYPizza --|>蘸酱 class 蘸酱{ <<interface>> } 面饼 <|.. 北京面饼 面饼 <|.. 纽约面饼 PizzaIngredientFactory --|>面饼 NYPizzaIngredientFactory --|>纽约面饼 ChinaPizzaIngredientFactory --|>北京面饼 NYPizza --|>面饼 class 面饼{ <<interface>> } 芝士 <|.. 北京芝士 芝士 <|.. 纽约芝士 PizzaIngredientFactory --|>芝士 NYPizzaIngredientFactory --|>纽约芝士 ChinaPizzaIngredientFactory --|>北京芝士 NYPizza --|>芝士 NYPizza --|>PizzaIngredientFactory class 芝士{ <<interface>> }
解释
NYPizzaStore 是抽象工厂的客户,负责创建Pizza 具体产品(NYPizza) , 传入原料工厂的实例(NYPizzaIngredientFactory),工厂被要求准备原料。
PizzaIngredientFactory 是抽象的Pizza原料工厂接口,他定义了如何产生一个相关产品的家族,这个家族包含了所有制作Pizza的原料,子类负责生产Pizza原料,每个工厂都知道如何产生符合自己区域的正确产品,对于此产品家族,每个工厂都有不同的实现,ChinaPizzaIngredientFactory,生产 北京面饼、北京芝士、北京蘸酱。
分享程序员的理财、生活!我是乐子,多多指教!
- EOF -
- 本文作者: 闾丘齐心
- 本文链接: http://www.blog.rdtalk.cn/2021/12/21/2021-12-21-work-Blog/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!