11.抽象工厂模式
2024-01-09 06:29:41
前言
前面我们已经介绍了简单工厂和工厂方法模式,我们先简单回顾一下
简单工厂模式
- 只有一个工厂类,负责创建所有产品。
- 所有产品的创建逻辑都在同一个工厂类中。
- 不符合开闭原则,当需要添加新产品时,需要修改工厂类。
工厂方法模式
- 引入抽象工厂接口,每个具体工厂负责创建一类产品。
- 每个产品有对应的工厂,符合开闭原则。
- 但如果有多个产品族,需要引入多个工厂接口。
抽象工厂模式
介绍
抽象工厂模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。抽象工厂模式是工厂方法模式的升级版,它引入了多个工厂接口,每个工厂接口负责创建一类产品。
组成部分
- 抽象工厂(Abstract Factory): 定义创建一系列产品对象的接口,每个方法对应一个产品。
- 具体工厂(Concrete Factory): 实现抽象工厂接口,负责创建一系列具体的产品。
- 抽象产品(Abstract Product): 定义一类产品对象的接口。
- 具体产品(Concrete Product): 实现抽象产品接口,具体产品由具体工厂创建。
结构图
场景
假设我们要创建一个跨平台的UI控件库,包括按钮和文本框,有两种不同的风格:Windows风格和Mac风格。
代码
// 抽象产品:按钮
interface Button {
void render();
}
// 抽象产品:文本框
interface TextBox {
void display();
}
// 具体产品1:Windows风格按钮
class WindowsButton implements Button {
@Override
public void render() {
System.out.println("Render Windows Button");
}
}
// 具体产品2:Mac风格按钮
class MacButton implements Button {
@Override
public void render() {
System.out.println("Render Mac Button");
}
}
// 具体产品3:Windows风格文本框
class WindowsTextBox implements TextBox {
@Override
public void display() {
System.out.println("Display Windows TextBox");
}
}
// 具体产品4:Mac风格文本框
class MacTextBox implements TextBox {
@Override
public void display() {
System.out.println("Display Mac TextBox");
}
}
// 抽象工厂:UI控件工厂
interface UIControlFactory {
Button createButton();
TextBox createTextBox();
}
// 具体工厂1:Windows风格工厂
class WindowsUIControlFactory implements UIControlFactory {
@Override
public Button createButton() {
return new WindowsButton();
}
@Override
public TextBox createTextBox() {
return new WindowsTextBox();
}
}
// 具体工厂2:Mac风格工厂
class MacUIControlFactory implements UIControlFactory {
@Override
public Button createButton() {
return new MacButton();
}
@Override
public TextBox createTextBox() {
return new MacTextBox();
}
}
// 客户端
public class AbstractFactoryPatternExample {
public static void main(String[] args) {
// 创建Windows风格UI控件
UIControlFactory windowsFactory = new WindowsUIControlFactory();
Button windowsButton = windowsFactory.createButton();
TextBox windowsTextBox = windowsFactory.createTextBox();
windowsButton.render();
windowsTextBox.display();
// 创建Mac风格UI控件
UIControlFactory macFactory = new MacUIControlFactory();
Button macButton = macFactory.createButton();
TextBox macTextBox = macFactory.createTextBox();
macButton.render();
macTextBox.display();
}
}
在这个例子中,UIControlFactory 是抽象工厂接口,定义了创建按钮和文本框的方法。WindowsUIControlFactory 和 MacUIControlFactory 是具体工厂,分别实现了Windows和Mac风格的UI控件。每个具体工厂对应一个产品族,即按钮和文本框的组合。客户端可以选择使用不同的工厂来创建不同风格的UI控件。这样,当需要增加新的UI控件时,只需要添加新的产品和工厂,而不需要修改现有的代码,符合开闭原则。
总结
我们再来总结一下工厂方法模式和抽象工厂模式的区别:
- 工厂方法模式是针对产品来定义工厂的,一类产品都需要一个工厂,如果一类产品有多个版本,那每个版本也需要各自对应一个工厂,会导致工厂的数量增加,这就是工厂方法模式的缺点。
- 而抽象工厂模式的出发点就是针对一个版本来定义一个工厂,比如有十个产品组成一个版本,那么只需要一个工厂来对应这个版本的十个产品即可,如果换成工厂方法模式,那么就需要10个工厂了。
文章来源:https://blog.csdn.net/csdn15917204572/article/details/135436275
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!