IE盒子

搜索
查看: 90|回复: 0

Java设计模式第2种之抽象工厂模式(创建型模式)

[复制链接]

3

主题

4

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2023-3-4 08:14:35 | 显示全部楼层 |阅读模式
一、什么是抽象工厂模式

抽象工厂模式是一种软件设计模式,它提供了一种方法来创建一组相关或相互依赖的对象,而无需指定它们具体的类。
抽象工厂模式是一种创建型设计模式,它通过提供一个接口来创建一些相关或依赖的对象,而无需指定他们的具体类。这样,当需要更换具体的产品族时,只需要更换相应的工厂实现即可。
抽象工厂模式包含以下角色:

  • AbstractFactory:抽象工厂
  • ConcreteFactory:具体工厂
  • AbstractProduct:抽象产品
  • ConcreteProduct:具体产品
  • Client:客户端
在抽象工厂模式中,客户端不需要知道所创建的具体产品的类名,只需要知道具体工厂和抽象产品的名称即可。当需要更换产品族时,只需要更换具体工厂即可。
二、抽象工厂模式案例

假设有一个电子产品制造商,生产手机和电脑。这个公司有两个工厂,分别生产苹果品牌的产品和三星品牌的产品。
首先,我们定义抽象工厂 AbstractFactory 和抽象产品 AbstractProduct:
// 抽象工厂
abstract class AbstractFactory {
  abstract AbstractPhone createPhone();
  abstract AbstractComputer createComputer();
}

// 抽象产品
abstract class AbstractPhone {
  abstract void call();
}

abstract class AbstractComputer {
  abstract void work();
}然后,我们定义两个具体工厂 AppleFactory 和 SamsungFactory,以及两个具体产品 ApplePhone 和 SamsungPhone、AppleComputer 和 SamsungComputer:
// 具体工厂
class AppleFactory extends AbstractFactory {
  AbstractPhone createPhone() {
    return new ApplePhone();
  }
  AbstractComputer createComputer() {
    return new AppleComputer();
  }
}

class SamsungFactory extends AbstractFactory {
  AbstractPhone createPhone() {
    return new SamsungPhone();
  }
  AbstractComputer createComputer() {
    return new SamsungComputer();
  }
}

// 具体产品
class ApplePhone extends AbstractPhone {
  void call() {
    System.out.println("使用苹果手机打电话");
  }
}

class SamsungPhone extends AbstractPhone {
  void call() {
    System.out.println("使用三星手机打电话");
  }
}

class AppleComputer extends AbstractComputer {
  void work() {
    System.out.println("使用苹果电脑工作");
  }
}

class SamsungComputer extends AbstractComputer {
  void work() {
    System.out.println("使用三星电脑工作");
  }
}最后,我们可以定义客户端 Client,使用抽象工厂和抽象产品:
class Client {
  AbstractFactory factory;

  Client(AbstractFactory factory) {
    this.factory = factory;
  }

  void buyPhone() {
    AbstractPhone phone = factory.createPhone();
    phone.call();
  }

  void buyComputer() {
    AbstractComputer computer = factory.createComputer();
    computer.work();
  }
}我们可以使用 Client 类来购买苹果品牌的手机和电脑:
Client client = new Client(new AppleFactory());
client.buyPhone(); // 使用苹果手机打电话
client.buyComputer(); // 使用苹果电脑工作也可以购买三星品牌的手机和电脑:
Client client = new Client(new SamsungFactory());
client.buyPhone(); // 使用三星手机打电话
client.buyComputer(); // 使用三星电脑工作当需要更换产品族时,只需要更换具体工厂的实现即可。
三、优点和缺点

优点:

  • 使用抽象工厂模式可以很方便地切换产品族,即可以很容易地更换一组具体产品的实现。
  • 抽象工厂模式隔离了具体产品的实现,使得客户端不需要关心产品的具体实现。
  • 抽象工厂模式可以支持产品族的扩展。
缺点:

  • 抽象工厂模式中的抽象工厂和抽象产品是比较抽象的概念,不太容易理解。
  • 当需要更换产品族时,必须更改抽象工厂的子类,这可能需要修改源代码,并可能导致代码不兼容。
四、使用场景


  • 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的。
  • 系统中有多于一个的产品族,而每次只使用其中某一产品族。
  • 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
  • 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
总之,抽象工厂模式适用于需要多个产品族的场景,并且每次只使用其中的一个产品族。
四、在java中哪些地方用到了抽象工厂

Java 语言自带的包管理器 Maven 内置了一个名为 javax.xml.parsers 的库,该库使用了抽象工厂模式来支持多种不同的 XML 解析器。
下面是使用该库解析 XML 文档的示例代码:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import java.io.IOException;

public class XmlParserExample {
  public static void main(String[] args) {
    // 创建文档构建器工厂
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    // 创建文档构建器
    try {
      DocumentBuilder builder = factory.newDocumentBuilder();
      // 解析 XML 文档
      Document document = builder.parse("document.xml");
      // 输出解析结果
      System.out.println(document);
    } catch (ParserConfigurationException | SAXException | IOException e) {
      e.printStackTrace();
    }
  }
}在这个示例中,DocumentBuilderFactory 类是一个抽象工厂。
创作不易,动下你发财小手帮忙点个赞呗。爱你哦,么么哒!!
23种设计模式直达地址:
第1种-单例模式(创建型模式)
第2种-抽象工厂模式(创建型模式)
第3种-抽象方法工厂模式(创建型)
第4种-建造者模式(创建型模式)
第5种-原型模式(创建型模式)
第6种-适配器模式(结构型模式)
第7种-桥接模式(结构型模式)
第8种-装饰模式(结构型模式)
第9种-组合模式(结构型模式)
第10种-外观模式(结构型模式)
第11种-享元模式(结构型模式)
第12种-代理模式(结构型模式)
第13种-观察者模式(行为型模式)
第14种-模板方法模式(行为型模式)
第15种-命令模式(行为型模式)
第16种-迭代器模式(行为型模式)
第17种-责任链模式(行为型模式)
第18种-策略模式(行为型模式)
第19种-状态模式(行为型模式)
第20种-访问者模式(行为型模式)
第21种-中介者模式(行为型模式)
第22种-备忘录模式(行为型模式)
第23种-解释器模式(行为型模式)
持续更新中......
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表