🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解单例模式请看: (一)趣学设计模式 之 单例模式!
一、 啥是工厂方法模式?
想象一下,你开了一家甜品店 🍰,有蛋糕 🎂、饼干 🍪、面包 🍞 三种甜点。如果只有一个厨师,啥都做,那他不得累死?而且万一你想加个新品种,还得让他学新的手艺,太麻烦了!
工厂方法模式就像这样,每种甜点都有自己的专属厨师(工厂),蛋糕厨师只做蛋糕,饼干厨师只做饼干,面包厨师只做面包。这样,每个厨师都专注于自己的领域,而且你想加新品种,只需要招一个新的厨师就行了!
简单来说,工厂方法模式就是:每个产品都有自己的专属工厂,负责创建该产品!
二、 为什么要用工厂方法模式?
- 职责分离: 每个工厂只负责创建一种产品,职责更清晰。
- 扩展性好: 添加新的产品类型,只需要添加新的工厂类即可,不需要修改原来的代码,符合开闭原则 👍。
- 灵活性高: 可以根据需要选择不同的工厂来创建产品。
三、 工厂方法模式怎么实现?
java">// 1. 定义产品接口
interface Dessert {
void show(); // 展示甜点
}
// 2. 定义具体的产品类
class Cake implements Dessert {
@Override
public void show() {
System.out.println("我是美味的蛋糕! 🎂");
}
}
class Cookie implements Dessert {
@Override
public void show() {
System.out.println("我是香甜的饼干! 🍪");
}
}
class Bread implements Dessert {
@Override
public void show() {
System.out.println("我是松软的面包! 🍞");
}
}
// 3. 定义工厂接口
interface DessertFactory {
Dessert createDessert(); // 创建甜点
}
// 4. 定义具体的工厂类
class CakeFactory implements DessertFactory {
@Override
public Dessert createDessert() {
System.out.println("蛋糕工厂正在制作蛋糕! 🍰");
return new Cake();
}
}
class CookieFactory implements DessertFactory {
@Override
public Dessert createDessert() {
System.out.println("饼干工厂正在制作饼干! 🍪");
return new Cookie();
}
}
class BreadFactory implements DessertFactory {
@Override
public Dessert createDessert() {
System.out.println("面包工厂正在制作面包! 🍞");
return new Bread();
}
}
// 5. 客户端使用
public class Client {
public static void main(String[] args) {
// 创建蛋糕工厂
DessertFactory cakeFactory = new CakeFactory();
// 生产蛋糕
Dessert cake = cakeFactory.createDessert();
cake.show(); // 输出:我是美味的蛋糕! 🎂
// 创建饼干工厂
DessertFactory cookieFactory = new CookieFactory();
// 生产饼干
Dessert cookie = cookieFactory.createDessert();
cookie.show(); // 输出:我是香甜的饼干! 🍪
// 创建面包工厂
DessertFactory breadFactory = new BreadFactory();
// 生产面包
Dessert bread = breadFactory.createDessert();
bread.show(); // 输出:我是松软的面包! 🍞
}
}
解释:
Dessert
:产品接口,定义了甜点的通用行为(展示自己)。Cake
、Cookie
和Bread
:具体的产品类,实现了Dessert
接口,分别代表蛋糕、饼干和面包。DessertFactory
:工厂接口,定义了创建甜点的通用方法。CakeFactory
、CookieFactory
和BreadFactory
:具体的工厂类,实现了DessertFactory
接口,分别负责创建蛋糕、饼干和面包。createDessert()
:创建甜点的方法。
输出结果:
蛋糕工厂正在制作蛋糕! 🍰
我是美味的蛋糕! 🎂
饼干工厂正在制作饼干! 🍪
我是香甜的饼干! 🍪
面包工厂正在制作面包! 🍞
我是松软的面包! 🍞
四、 工厂方法模式的应用场景
- 日志框架: 可以使用工厂方法模式创建不同类型的日志记录器(文件日志、数据库日志等)。
- 支付系统: 可以使用工厂方法模式创建不同类型的支付方式(支付宝、微信支付等)。
- 游戏开发: 可以使用工厂方法模式创建不同类型的游戏角色(战士、法师、弓箭手等)。
五、 工厂方法模式的优点和缺点
优点:
- 职责分离: 每个工厂只负责创建一种产品,职责更清晰。
- 扩展性好: 添加新的产品类型,只需要添加新的工厂类即可,不需要修改原来的代码,符合开闭原则 👍。
- 灵活性高: 可以根据需要选择不同的工厂来创建产品。
缺点:
- 类增多: 需要为每个产品都创建一个工厂类,导致类的数量增多。
- 复杂度增加: 代码结构相对复杂,理解起来稍微困难。