设为首页 加入收藏

TOP

Factory Pattern —— Creational Class(一)
2023-09-09 10:26:00 】 浏览:91
Tags:Factory Pattern Creational Class

core

工厂模式(Factory Pattern)是一种创建型设计模式,用于创建对象而不暴露对象创建的逻辑。它将对象的实例化过程封装在一个工厂类中,客户端通过调用工厂类的方法来创建对象,从而实现了解耦和灵活性。

工厂模式的核心思想是将对象的创建与使用分离。客户端不直接实例化对象,而是通过调用工厂类的方法来获取对象实例。工厂类根据客户端的需求,决定实例化哪个具体对象,并将其返回给客户端。

三种工厂模式的识别

简单工厂模式工厂方法模式抽象工厂模式都属于创建型设计模式,用于封装对象的创建过程(相同点),但它们之间有明显的区别。

不同点:

  • 简单工厂模式(Simple Factory Pattern):
    简单工厂模式通过一个工厂类来创建产品对象,客户端通过调用工厂类的静态方法或实例方法来获取对象实例。
    工厂类负责根据客户端的需求,决定实例化哪个具体产品类。
    简单工厂模式的主要特点是工厂类集中了对象的创建逻辑,客户端通过工厂类来创建产品对象,而无需直接实例化具体产品类。但是,当需求变化时,需要修改工厂类的代码。

  • 工厂方法模式(Factory Method Pattern):
    工厂方法模式将对象的创建延迟到子类中每个具体产品类都有对应的工厂类
    抽象工厂类定义了创建产品对象的抽象方法,每个具体工厂类实现了抽象工厂类,负责创建具体产品的实例。
    工厂方法模式包括:
    - 抽象工厂类
    - 具体工厂类
    - 抽象产品类
    - 具体产品类
    客户端通过调用具体工厂类的方法来创建不同的产品对象。客户端可以通过扩展抽象工厂类和具体工厂类来创建新的产品。

  • 抽象工厂模式(Abstract Factory Pattern):
    抽象工厂模式提供了一种创建一系列相关或相互依赖对象的接口,而无需指定具体类。
    抽象工厂模式包括(所包含的角色和工厂方法模式一样):
    - 抽象工厂类
    - 具体工厂类
    - 抽象产品类
    - 具体产品类
    抽象工厂类定义了一组创建产品对象的抽象方法,每个具体工厂类实现了抽象工厂类,负责创建一组相关的具体产品。
    客户端通过调用具体工厂类的方法来创建一组相关的产品对象。

总结:
简单工厂模式适用于创建单一类型的产品,通过一个工厂类来创建产品对象。
工厂方法模式适用于创建一类产品,每个具体产品都有对应的工厂类,通过扩展工厂类来创建新的产品。
抽象工厂模式适用于创建一组相关的产品,每个具体工厂类负责创建一组相关的产品对象。

选择使用哪种模式取决于具体需求和设计目标:

  • 简单工厂模式简单易用,但对于复杂的产品结构不够灵活;
  • 工厂方法模式适用于需要灵活扩展产品类的情况;
  • 抽象工厂模式适用于需要创建一组相关产品 并保持一致性的情况。(抽象工厂模式适用于一组相关的产品对象的创建,如果产品对象之间没有相关性或依赖关系,请考虑使用工厂方法模式。)

工厂模式和抽象工厂模式的关系

工厂模式里的工厂和产品是一对一的关系,
抽象工厂模式里的工厂和产品是一对多的关系,当然如果抽象工厂模式里面产品的种类只有一种的话,那么他和工厂模式也没啥区别!
抽象工厂模式可以想成是工厂模式的升级版。

我画了一副图来简述他们之间的差异:

工厂方法模式 VS 抽象工厂模式

Simple Factory Pattern

下面是一个简单的示例代码,说明了简单工厂模式的基本结构:

// 产品接口
interface Product {
    void operation();
}

// 具体产品A
class ConcreteProductA implements Product {
    public void operation() {
        System.out.println("ConcreteProductA operation");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    public void operation() {
        System.out.println("ConcreteProductB operation");
    }
}

// 工厂类
class Factory {
    public Product createProduct(String type) {
        if (type.equals("A")) {
            return new ConcreteProductA();
        } else if (type.equals("B")) {
            return new ConcreteProductB();
        }
        return null;
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Factory factory = new Factory();
        
        // 创建具体产品A
        Product productA = factory.createProduct("A");
        productA.operation();
        
        // 创建具体产品B
        Product productB = factory.createProduct("B");
        productB.operation();
    }
}

在上面的示例中,Product 是产品接口,定义了产品的操作方法。ConcreteProductA 和 ConcreteProductB 是具体产品类,实现了产品接口,并定义了各自的操作方法。Factory 是工厂类,负责创建产品对象的方法。客户端通过调用工厂类的方法来创建具体产品的实例,并调用其操作方法。

通过使用工厂模式,客户端可以通过工厂类来创建具体产品的实例,而无需直接依赖具体产品类。这样可以实现代码的解耦和灵活性,使得系统更易于扩展和维护。

Factory Method Pattern

下面是一个简单的示例代码,说明了工厂方法模式的基本结构:

// 抽象产品
interface Product {
    void operation();
}

// 具体产品A
class ConcreteProductA implements Product {
    public void operation() {
        System.out.println("Concrete ProductA operation");
    }
}

// 具体产品B
class ConcreteProductB implements Product {
    public void operation() {
        System.out.println("Concrete ProductB operation");
    }
}

// 抽象工厂
interface Factory {
    Product createProduct();
}

// 具体工厂A
class ConcreteFactoryA implements Factory {
    public Product createProduct() {
        return new ConcreteProductA();
    }
}

// 具体工厂B
class ConcreteFactoryB implements Factory {
    public Product createProduct() {
        return new ConcreteProductB();
    }
}

// 客户端代码
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇面试官:synchronized 能不能禁止.. 下一篇【深度思考】如何优雅的实现脱敏?

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目