简单工厂模式
角色 |
介绍 |
抽象产品 |
产品规范,定义了产品的主要特性和功能 |
具体产品 |
实现或者继承抽象产品的子类 |
具体工厂 |
提供了创建产品的方法,使用者通过该方法获取产品 |
| abstract class Coffee {} |
| class CoffeeA extends Coffee {} |
| class CoffeeB extends Coffee {} |
| |
| public class EasyFactory { |
| public Coffee createCoffee(String type) { |
| Coffee coffee = null; |
| if ("coffeeA".equals(type)) { |
| coffee = new CoffeeA(); |
| } else if ("coffeeB".equals(type)) { |
| coffee = new CoffeeB(); |
| } |
| return coffee; |
| } |
| } |
|
简单工厂模式 |
优点 |
后期如果需要对象直接从工厂中获取即可 |
缺点 |
后期如果再添加新的类,就必须修改工厂的代码,违反了开闭原则 |
工厂方法模式
介绍 |
内容 |
抽象工厂 |
创建产品的接口 |
具体工厂 |
完成具体产品的创建 |
抽象产品 |
定义了产品的规范,描述了产品的主要特性和功能 |
具体产品 |
实现抽象产品所定义的接口,由具体工厂来创建 |
|
说明 |
优点 |
不需要修改工厂类的代码了 |
缺点 |
要相应的一直增加工厂类 |
| abstract class Fruit {} |
| class Apple extends Fruit {} |
| class Orange extends Fruit {} |
| |
| interface Factory { |
| Fruit makeFruit(); |
| } |
| class FactoryMethodA implements Factory { |
| @Override |
| public Fruit makeFruit() { |
| return new Apple(); |
| } |
| } |
| class FactoryMethodB implements Factory { |
| @Override |
| public Fruit makeFruit() { |
| return new Orange(); |
| } |
| } |
抽象工厂模式

产品族:
- 左边部分,这部分的东东都是属于同一个产品族的,里面包含有外套、领带、衬衫、西裤、皮鞋等等这些产品,很明显能感受到这个产品族是属于商务风格的。
- 右边部分,这部分的东东同样属于同一个产品族,里面包含有运动上衣、毛衫、运动裤子、运动鞋等等这些产品,看得出来这个产品族是属于运动风格的。
产品级别:
- 如何去体现同级别的产品呢?同种类的产品就是同级别的产品。
- 商务风的上衣是上衣,运动风的上衣它也是上衣,所以它们属于同级别的产品。
- 再比如鞋子,皮鞋和运动鞋就属于不同产品族里面的同种类产品。
|
说明 |
优点 |
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。 这是什么意思呢?我给大家简单的去解释一下,就拿以上案例来说,意大利风味的甜点工厂它只生产拿铁咖啡和提拉米苏这样的产品,你如果没有去创建其它的工厂对象的话,那么你就只能点这俩产品,这保证了它俩的一个搭配。如果后期你想换口味了,想点拿铁咖啡和抹茶慕斯,那么对不起,做不到!那么问题是不是就随之产生了啊! |
缺点 |
当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。这是什么意思呢?还是拿以上案例来说,现在生产的有两类产品,一类是甜点,一类是咖啡,这时如果我们再添加一类产品,即汉堡,那么你会发现所有的工厂类(包括抽象工厂和具体工厂)的代码都需要进行修改,因为我们需要再加一个方法,即生产汉堡的方法。 |
| abstract class Color {} |
| class Black extends Color {} |
| class Write extends Color {} |
| |
| abstract class Animal {} |
| class Tigger extends Animal {} |
| class Cat extends Animal {} |
| |
| interface AbsFac { |
| Color createBlack(); |
| Animal createWrite(); |
| } |
| class AbstractFactoryA implements AbsFac { |
| @Override |
| public Color createBlack() { |
| return new Black(); |
| } |
| |
| @Override |
| public Animal createWrite() { |
| return new Tigger(); |
| } |
| } |
| class AbstractFactoryB implements AbsFac { |
| @Override |
| public Color createBlack() { |
| return new Write(); |
| } |
| |
| @Override |
| public Animal createWrite() { |
| return new Cat(); |
| } |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?