🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解工厂方法模式请看: (二)趣学设计模式 之 工厂方法模式!
一、 啥是抽象工厂模式?
想象一下,你开了一家家具店 🪑,要卖不同风格的家具,比如现代风格和古典风格。每种风格都包含一套完整的家具,包括沙发 🛋️、茶几 ☕️、椅子 💺。
抽象工厂模式就像这样,每个风格都有自己的专属工厂,现代风格工厂生产现代风格的沙发、茶几和椅子,古典风格工厂生产古典风格的沙发、茶几和椅子。这样,你只需要选择一个风格的工厂,就能得到一整套风格统一的家具!
简单来说,抽象工厂模式就是:生产一系列相关的产品,保证这些产品风格统一!
二、 为什么要用抽象工厂模式?
- 产品族概念: 强调产品之间的关联性,保证产品风格统一。
- 易于切换产品族: 只需要更换工厂,就能切换到另一套风格的产品。
- 符合开闭原则: 添加新的产品族,只需要添加新的工厂类即可,不需要修改原来的代码 👍。
三、 抽象工厂模式怎么实现?
// 1. 定义抽象产品接口
interface Sofa {
void comfort(); // 舒适度
}
interface CoffeeTable {
void place(); // 放置物品
}
interface Chair {
void sit(); // 坐
}
// 2. 定义具体的产品类
// 现代风格家具
class ModernSofa implements Sofa {
@Override
public void comfort() {
System.out.println("现代沙发,舒适度高! ✨");
}
}
class ModernCoffeeTable implements CoffeeTable {
@Override
public void place() {
System.out.println("现代茶几,可以放置各种物品! 💻");
}
}
class ModernChair implements Chair {
@Override
public void sit() {
System.out.println("现代椅子,坐着很舒服! 😊");
}
}
// 古典风格家具
class ClassicSofa implements Sofa {
@Override
public void comfort() {
System.out.println("古典沙发,很有历史感! 🕰️");
}
}
class ClassicCoffeeTable implements CoffeeTable {
@Override
public void place() {
System.out.println("古典茶几,可以放置古董! 🏺");
}
}
class ClassicChair implements Chair {
@Override
public void sit() {
System.out.println("古典椅子,坐着很有仪式感! 👑");
}
}
// 3. 定义抽象工厂接口
interface FurnitureFactory {
Sofa createSofa();
CoffeeTable createCoffeeTable();
Chair createChair();
}
// 4. 定义具体的工厂类
// 现代风格家具工厂
class ModernFurnitureFactory implements FurnitureFactory {
@Override
public Sofa createSofa() {
System.out.println("现代家具工厂正在生产现代沙发! 🛋️");
return new ModernSofa();
}
@Override
public CoffeeTable createCoffeeTable() {
System.out.println("现代家具工厂正在生产现代茶几! ☕");
return new ModernCoffeeTable();
}
@Override
public Chair createChair() {
System.out.println("现代家具工厂正在生产现代椅子! 💺");
return new ModernChair();
}
}
// 古典风格家具工厂
class ClassicFurnitureFactory implements FurnitureFactory {
@Override
public Sofa createSofa() {
System.out.println("古典家具工厂正在生产古典沙发! 🛋️");
return new ClassicSofa();
}
@Override
public CoffeeTable createCoffeeTable() {
System.out.println("古典家具工厂正在生产古典茶几! ☕");
return new ClassicCoffeeTable();
}
@Override
public Chair createChair() {
System.out.println("古典家具工厂正在生产古典椅子! 💺");
return new ClassicChair();
}
}
// 5. 客户端使用
public class Client {
public static void main(String[] args) {
// 创建现代风格家具工厂
FurnitureFactory modernFactory = new ModernFurnitureFactory();
// 生产一套现代风格家具
Sofa modernSofa = modernFactory.createSofa();
CoffeeTable modernCoffeeTable = modernFactory.createCoffeeTable();
Chair modernChair = modernFactory.createChair();
modernSofa.comfort(); // 输出:现代沙发,舒适度高! ✨
modernCoffeeTable.place(); // 输出:现代茶几,可以放置各种物品! 💻
modernChair.sit(); // 输出:现代椅子,坐着很舒服! 😊
// 创建古典风格家具工厂
FurnitureFactory classicFactory = new ClassicFurnitureFactory();
// 生产一套古典风格家具
Sofa classicSofa = classicFactory.createSofa();
CoffeeTable classicCoffeeTable = classicFactory.createCoffeeTable();
Chair classicChair = classicFactory.createChair();
classicSofa.comfort(); // 输出:古典沙发,很有历史感! 🕰️
classicCoffeeTable.place(); // 输出:古典茶几,可以放置古董! 🏺
classicChair.sit(); // 输出:古典椅子,坐着很有仪式感! 👑
}
}
代码解释:
Sofa
、CoffeeTable
和Chair
:抽象产品接口,定义了家具的通用行为。ModernSofa
、ModernCoffeeTable
、ModernChair
、ClassicSofa
、ClassicCoffeeTable
和ClassicChair
:具体的产品类,实现了家具接口,分别代表现代风格和古典风格的沙发、茶几和椅子。FurnitureFactory
:抽象工厂接口,定义了创建一套家具的通用方法。ModernFurnitureFactory
和ClassicFurnitureFactory
:具体的工厂类,实现了FurnitureFactory
接口,分别负责创建现代风格和古典风格的家具。createSofa()
、createCoffeeTable()
和createChair()
:创建家具的方法。
输出结果:
现代家具工厂正在生产现代沙发! 🛋️
现代家具工厂正在生产现代茶几! ☕
现代家具工厂正在生产现代椅子! 💺
现代沙发,舒适度高! ✨
现代茶几,可以放置各种物品! 💻
现代椅子,坐着很舒服! 😊
古典家具工厂正在生产古典沙发! 🛋️
古典家具工厂正在生产古典茶几! ☕
古典家具工厂正在生产古典椅子! 💺
古典沙发,很有历史感! 🕰️
古典茶几,可以放置古董! 🏺
古典椅子,坐着很有仪式感! 👑
四、 抽象工厂模式的应用场景
- GUI 框架: 可以使用抽象工厂模式创建不同风格的界面组件(按钮、文本框、窗口等)。
- 游戏开发: 可以使用抽象工厂模式创建不同风格的游戏角色、场景、道具等。
- 操作系统: 可以使用抽象工厂模式创建不同风格的操作系统界面。
五、 抽象工厂模式的优点和缺点
优点:
- 产品族概念: 强调产品之间的关联性,保证产品风格统一。
- 易于切换产品族: 只需要更换工厂,就能切换到另一套风格的产品。
- 符合开闭原则: 添加新的产品族,只需要添加新的工厂类即可,不需要修改原来的代码 👍。
缺点:
- 难以扩展产品: 如果要添加新的产品类型(比如添加一个书柜),需要修改所有的工厂接口和实现类,比较麻烦 😥。
- 复杂度增加: 代码结构相对复杂,理解起来稍微困难。
六、 抽象工厂模式与工厂方法模式的区别
抽象工厂模式和工厂方法模式都是工厂模式,但它们解决的问题不同:
- 工厂方法模式: 关注的是单个产品的创建,每个工厂只负责创建一种产品。
- 抽象工厂模式: 关注的是产品族的创建,每个工厂负责创建一系列相关的产品。
举个例子:
- 工厂方法模式: 就像不同的甜品店,蛋糕店只卖蛋糕,饼干店只卖饼干,面包店只卖面包。
- 抽象工厂模式: 就像不同的家具店,现代家具店卖现代风格的沙发、茶几和椅子,古典家具店卖古典风格的沙发、茶几和椅子。
总结一下:
特性 | 工厂方法模式 | 抽象工厂模式 |
---|---|---|
关注点 | 单个产品的创建 | 产品族的创建 |
产品关系 | 产品之间没有必然联系 | 产品之间存在关联,风格统一 |
扩展性 | 易于扩展新的产品类型 | 易于扩展新的产品族,但难以扩展单个产品类型 |
适用场景 | 产品类型较多,需要灵活扩展的场景 | 产品族概念明确,且需要灵活切换产品族的场景 |
七、 总结
- 抽象工厂模式用于创建一系列相关的产品,保证这些产品风格统一。
- 每个工厂负责创建一套完整的产品族。
- 添加新的产品族,只需要添加新的工厂类即可,符合开闭原则。
- 抽象工厂模式适用于产品族概念明确,且需要灵活切换产品族的场景。
- 抽象工厂模式与工厂方法模式的区别在于,抽象工厂模式关注的是产品族的创建,而工厂方法模式关注的是单个产品的创建。
希望这篇文章能让你彻底理解抽象工厂模式,并区分它与工厂方法模式! 👍
看完请看:(四)趣学设计模式 之 原型模式!