程序员的知识教程库

网站首页 > 教程分享 正文

设计模式-抽象工厂模式详解(抽象工厂模式包含的角色)

henian88 2024-10-18 05:57:28 教程分享 2 ℃ 0 评论

基本介绍

抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。

类结构图

类图说明:

  1. 抽象产品(Abstract Product) 为构成系列产品的一组不同但相关的产品申明接口。
  2. 具体产品(Concrete Product) 是抽象产品的多种不同类型的实现。所有变体都必须实现相应的抽象产品。
  3. 抽象工厂(Abstract Factory) 接口声明了一组创建各种抽象产品的方法。
  4. 具体工厂(Concrete Factory) 实现抽象工厂的构建方法。每个具体的工厂都对应特定产品变体,且仅创建此种产品变体。
  5. 客户端(Client) 只需通过抽象接口调用工厂和产品对象,就能与任何具体工厂/产品 变体交互。尽管具体工厂会对具体产品进行初始化,其构建方法签名必须返回相应的抽象产品,这样使用工厂类的客户端代码就不会与工厂创建的特定产品变体耦合。

实现方式

  1. 以不同的产品类型与产品变体为维度绘制矩阵。
  2. 为所有产品声明抽象产品接口。 然后让所有具体产品类实现这些接口。
  3. 声明抽象工厂接口, 并且在接口中为所有抽象产品提供一组构建方法。
  4. 为每种产品变体实现一个具体工厂类。
  5. 在应用程序中开发初始化代码。 该代码根据应用程序配置或当前环境, 对特定具体工厂类进行初始化。 然后将该工厂对象传递给所有需要创建产品的类。
  6. 找出代码中所有对产品构造函数的直接调用, 将其替换为对工厂对象中相应构建方法的调用。

适用场景
如果代码需要与多个不同系列的相关产品交互, 但是由于无法提前获取相关信息, 或者出于对未来扩展性的考虑, 你不希望代码基于产品的具体类进行构建, 在这种情况下,你可以使用抽象工厂。

抽象工厂为你提供了一个接口, 可用于创建每个系列产品的对象。 只要代码通过该接口创建对象, 那么你就不会生成与应用程序已生成的产品类型不一致的产品。

  • 如果你有一个基于一组抽象方法的类, 且其主要功能因此变得不明确, 那么在这种情况下可以考虑使用抽象工厂模式。
  • 在设计良好的程序中, 每个类仅负责一件事。 如果一个类与多种类型产品交互, 就可以考虑将工厂方法抽取到独立的工厂类或具备完整功能的抽象工厂类中。

实例代码

  1. 抽象产品:AbstractProduct
public abstract class AbstractProduct {

    /**
     * 获取产品名称
     * @return
     */
    public abstract String productName();

    /**
     * 获取产品价格
     * @return
     */
    public abstract long productPrice();

    public void show() {
        System.out.println("产品名称:" + productName() + ";产品价格:" + productPrice() + "分");
    }
}
  1. 具体的产品:ConcreteProduct1 和 ConcreteProduct2
public class ConcreteProduct1 extends AbstractProduct{
    @Override
    public String productName() {
        return "产品1";
    }

    @Override
    public long productPrice() {
        return 10 * 100;
    }
}
public class ConcreteProduct2 extends AbstractProduct{

    @Override
    public String productName() {
        return "产品2";
    }

    @Override
    public long productPrice() {
        return 20 * 100;
    }
}
  1. 抽象工厂:AbstractProductFactory
public abstract class AbstractProductFactory {
    /**
     * 创建产品
     * @return
     */
    public abstract AbstractProduct createProduct();

}
  1. 具体工厂:ProductFactory1和ProductFactory2
public class ProductFactory1 extends AbstractProductFactory{

    @Override
    public AbstractProduct createProduct() {
        return new ConcreteProduct1();
    }
}
public class ProductFactory2 extends AbstractProductFactory {
    @Override
    public AbstractProduct createProduct() {
        return new ConcreteProduct2();
    }
}
  1. 客户端:ClientTest
public class Client {

    private final AbstractProductFactory factory;

    public Client(AbstractProductFactory factory) {
        this.factory = factory;
    }

    public void show(){
        factory.createProduct().show();
    }
}

这边我们构造方法根据需要传入不同的具体工厂实现进来。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表