上一篇地址:赶紧收藏!2024 年最常见 20道设计模式面试题(一)-CSDN博客
抽象工厂模式是一种创建型设计模式,用于创建一系列相关或依赖对象的接口,而无需指定它们具体的类。这种模式通常用于当需要生成一组对象时,这些对象具有共同的抽象特性,但是具体实现可能因情况而异。
- // 抽象产品A
- interface ProductA {
- void doSomething();
- }
-
- // 具体产品A1
- class ConcreteProductA1 implements ProductA {
- public void doSomething() {
- System.out.println("具体产品A1的doSomething方法");
- }
- }
-
- // 抽象产品B
- interface ProductB {
- void doSomething();
- }
-
- // 具体产品B1
- class ConcreteProductB1 implements ProductB {
- public void doSomething() {
- System.out.println("具体产品B1的doSomething方法");
- }
- }
-
- // 抽象工厂
- interface Factory {
- ProductA createProductA();
- ProductB createProductB();
- }
-
- // 具体工厂1
- class ConcreteFactory1 implements Factory {
- public ProductA createProductA() {
- return new ConcreteProductA1();
- }
-
- public ProductB createProductB() {
- return new ConcreteProductB1();
- }
- }
抽象工厂模式的一个实际应用例子是GUI工具包。假设你正在开发一个应用程序,需要支持多种不同的GUI工具包,例如Windows风格和Mac风格。每种风格都有自己的按钮、文本框等控件。
- // GUI组件的抽象产品
- interface Button {
- void paint();
- }
-
- interface TextBox {
- void paint();
- }
-
- // Windows风格的具体产品
- class WindowsButton implements Button {
- public void paint() {
- System.out.println("绘制Windows风格的按钮");
- }
- }
-
- class WindowsTextBox implements TextBox {
- public void paint() {
- System.out.println("绘制Windows风格的文本框");
- }
- }
-
- // Mac风格的具体产品
- class MacButton implements Button {
- public void paint() {
- System.out.println("绘制Mac风格的按钮");
- }
- }
-
- class MacTextBox implements TextBox {
- public void paint() {
- System.out.println("绘制Mac风格的文本框");
- }
- }
-
- // 抽象工厂
- interface GUIFactory {
- Button createButton();
- TextBox createTextBox();
- }
-
- // Windows风格的具体工厂
- class WindowsFactory implements GUIFactory {
- public Button createButton() {
- return new WindowsButton();
- }
-
- public TextBox createTextBox() {
- return new WindowsTextBox();
- }
- }
-
- // Mac风格的具体工厂
- class MacFactory implements GUIFactory {
- public Button createButton() {
- return new MacButton();
- }
-
- public TextBox createTextBox() {
- return new MacTextBox();
- }
- }
在这个例子中,GUIFactory
是一个抽象工厂,用于创建GUI组件。WindowsFactory
和MacFactory
是具体工厂,分别生成Windows和Mac风格的GUI组件。应用程序可以根据用户的选择或系统环境来使用不同的工厂,从而生成相应风格的GUI组件。这样,应用程序的GUI就可以很容易地适应不同的操作系统风格,而不需要修改大量的代码。
建造者模式(Builder Pattern)是一种创建型设计模式,用于解决复杂对象的构建问题。它允许通过逐步构建一个复杂对象来分离对象的构建过程和表示,使得同一个构建过程可以创建不同的表示。
- // 产品类
- class Product {
- private String part1;
- private String part2;
-
- public void setPart1(String part1) {
- this.part1 = part1;
- }
-
- public void setPart2(String part2) {
- this.part2 = part2;
- }
-
- @Override
- public String toString() {
- return "Product{" +
- "part1='" + part1 + '\'' +
- ", part2='" + part2 + '\'' +
- '}';
- }
- }
-
- // 建造者接口
- interface Builder {
- void setPart1(String part1);
- void setPart2(String part2);
- Product build();
- }
-
- // 具体建造者
- class ConcreteBuilder implements Builder {
- private Product product = new Product();
-
- public void setPart1(String part1) {
- product.setPart1(part1);
- }
-
- public void setPart2(String part2) {
- product.setPart2(part2);
- }
-
- public Product build() {
- return product;
- }
- }
-
- // 指挥者
- class Director {
- public Product construct(Builder builder) {
- builder.setPart1("Part1");
- builder.setPart2("Part2");
- return builder.build();
- }
- }
建造者模式非常适合于以下场景:
例如,假设你正在构建一个汽车配置系统,汽车可能有不同的引擎、轮胎、颜色等配置选项。使用建造者模式,你可以定义一个汽车建造者接口,然后为每种配置实现一个具体的建造者类。指挥者类可以根据不同的需求调用不同的建造者来构建具有特定配置的汽车实例。
通过这种方式,建造者模式提供了一种灵活且可扩展的方式来构建复杂的对象,同时保持了代码的清晰和易于管理。